是否有标准库函数或更 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)
是否有标准库函数或更 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)
通常,执行这类事情是个坏主意。在许多情况下,您可以做的最 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”要做的事情是推迟这种检查并尝试在某些上下文中使用该对象——如果它失败了,那么你可以做一些事情来做出反应。
def itemize(i):
try:
return list(i) # Will return a list if provided an iterable
except TypeError:
return [i]
不完全确定你为什么认为你需要这个,它可能是你实际需要的其他地方的问题。
如果你必须输入检查(你通常应该在 python 中避免,我很想在这里看到一些需要的上下文)你可以使用isinstance
这个更可取的速记。
def makelist(i):
return i if isinstance(i, list) else [i]