0

是否有标准库函数或更 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)
4

3 回答 3

4

通常,执行这类事情是个坏主意。在许多情况下,您可以做的最 Pythonic 的事情是检查您的项目是否是一个序列

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

传递您可能不想传递的东西的一个实例是字符串...字符串是序列,因此to_sequence('foo')将 return 'foo',而不是['foo']-但您不太可能希望它['f','o','o']是...所以您可能需要特殊情况如果需要的话。

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

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

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

于 2013-01-30T03:21:50.280 回答
2
def itemize(i):
    try:
        return list(i) # Will return a list if provided an iterable
    except TypeError:
        return [i]

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

于 2013-01-30T03:19:04.673 回答
2

如果你必须输入检查(你通常应该在 python 中避免,我很想在这里看到一些需要的上下文)你可以使用isinstance这个更可取的速记。

def makelist(i):
  return i if isinstance(i, list) else [i]
于 2013-01-30T03:19:29.520 回答