我有一个函数,可以包含一个数字或一个数字列表.什么是最pythonic方式检查它是什么?到目前为止,我已经提出了try/except块检查,如果我可以切片零项,即.OBJ [0:0]
编辑:
由于没有提供足够的信息,我似乎已经在下面开始了一场口水战.为了完整性,让我提供更多细节,以便我可以挑选并获得最佳答案:
我在Python 2.6上运行Django,我正在编写一个可以接受Django模型实例或查询集对象并对其执行操作的函数,其中一个函数涉及使用需要列表的过滤器'in'(查询集输入) ),或者如果它不是列表,那么我会使用'get'过滤器(django get过滤器).
Ale*_*lli 21
在这种情况下,您通常需要检查任何可迭代的,而不仅仅是列表 - 如果您接受列表或数字,拒绝(例如)元组将是奇怪的.您可能想要将其视为"标量"的一种可迭代是一个字符串 - 在Python 2.*中,这意味着str或unicode.那么,要么:
def isNonStringIterable(x):
if isinstance(x, basestring):
return False
try: iter(x)
except: return False
else: return True
Run Code Online (Sandbox Code Playgroud)
或者,通常更方便:
def makeNonStringIterable(x):
if isinstance(x, basestring):
return (x,)
try: return iter(x)
except: return (x,)
Run Code Online (Sandbox Code Playgroud)
你去哪里 for i in makeNonStringIterable(x): ...
Vin*_*nce 13
if isinstance(your_object, list):
print("your object is a list!")
Run Code Online (Sandbox Code Playgroud)
这比使用类型检查更像Pythonic.
似乎也更快:
>>> timeit('isinstance(x, list)', 'x = [1, 2, 3, 4]')
0.40161490440368652
>>> timeit('type(x) is list', 'x = [1, 2, 3, 4]')
0.46065497398376465
>>>
Run Code Online (Sandbox Code Playgroud)
Geo*_*lly 11
你没有.
这仅适用于Python> = 2.6.如果您的目标是以下任何内容,请使用Alex的解决方案.
Python支持名为Duck Typing的东西.您可以使用ABC类查找某些功能.
import collections
def mymethod(myvar):
# collections.Sqeuence to check for list capabilities
# collections.Iterable to check for iterator capabilities
if not isinstance(myvar, collections.Iterable):
raise TypeError()
Run Code Online (Sandbox Code Playgroud)