【问题标题】:Accepting a list either of strings or (str, dict) tuples接受字符串或 (str, dict) 元组的列表
【发布时间】:2020-08-28 13:54:49
【问题描述】:

我有一个函数可以接受类似列表的元组并对其进行迭代:

def fn(arglist):
  for col, extra in arglist:
    # do stuff with col, extra

这里col 应该是一个字符串,extra 是一个额外参数的字典。

通常 extra 最终是空的,所以人们经常这样调用这个函数:

fn(arglist=[ ('foo', {}), ('bar', {}), ('baz', {}) ])

我想更改 fn 以便它可以接受 either 元组列表(如上)或简单的字符串列表,这将允许您制作与上面相同的调用只是:

fn(arglist=[ 'foo', 'bar', 'baz'])

如何更改 fn 以执行相同的迭代但在传递字符串的情况下使用空字典?

我可以明确检查元素是否可迭代,例如:

def fn(arglist):
  for maybe_tuple in arglist:
    if isinstance(obj, Iterable):
      col, extra = maybe_tuple
    else:
      col, extra = maybe_tuple, {}

...但这似乎很尴尬。这里有什么更pythonic的方式来处理元组和非元组的情况?

【问题讨论】:

  • 这实际上行不通 - 字符串也是可迭代的。
  • 只检查item是否是一个字符串实例。
  • 一种可能性是使用type(arglist[0])type(arglist[1]) 检查参数的类型并相应地转换参数?

标签: python python-3.x


【解决方案1】:

这有点pythonic,但是遇到这种情况是“代码味道”恕我直言

def fn(arglist):
  for arg in arglist:
    try:
      col, extra = arg
    except ValueError:
      col, extra = arg, {}
    # do stuff with col, extra

【讨论】:

  • 我在 Python 库中一直遇到这种模式(多态列表作为参数)。你会建议我如何去除气味?
  • 嗯,多态列表更常用于“看起来相同”的元素(例如:文件类对象,字符串类对象,...)。基本上他们有一个共同的界面。在这里,您有不同的野兽(字符串与元组),但这取决于您的用例。如果这对你有用,那就去吧! :-)
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 2017-06-27
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多