Pythonic总是得到一个列表的方式

时间:2013-01-30 03:15:10

标签: python

是否有标准库函数或更多pythonic方法来执行此操作?

def itemize(i):
    if type(i) is list:
        return i
    return [i]

上下文:

在从单值到列表的db(nosql样式)迁移中很有用

doc = <get doc from db>
for i in itemize(doc.var1):
    #blah

doc.var1 = itemize(doc.var1)

3 个答案:

答案 0 :(得分:4)

通常,强制执行此类操作是个坏主意。在许多情况下,您可以做的最蟒蛇的事情是检查您的项目是否是序列

import collections
def to_sequence(item):
    return item if isinstance(item,collections.Sequence) else [item]

这个传递可能不想传递的内容的一个实例是字符串...字符串是序列,因此to_sequence('foo')将返回'foo',而不是{{ 1}} - 但你不太可能希望它是['foo'] ......所以如果需要,你可能需要特殊情况。

一个简单的解决方法是(对于python2.x):

['f','o','o']

但同样,通常“pythonic”要做的是推迟这种检查,并尝试在某些情况下使用该对象 - 如果失败,那么你可以做一些反应。

答案 1 :(得分:2)

def itemize(i):
    try:
        return list(i) # Will return a list if provided an iterable
    except TypeError:
        return [i]

不完全确定为什么你认为你需要这个,它可能是你真正需要的其他地方的问题。

答案 2 :(得分:2)

如果你必须键入check(你通常应该在python中避免,我希望在这里看到一些需要的上下文),你可以使用这个使用isinstance的速记,这是更好的。< / p>

def makelist(i):
  return i if isinstance(i, list) else [i]