[英]What is the pythonic way of checking if an object is a list?
我有一个函数,可以包含一个数字或一个数字列表。 什么是最pythonic方式检查它是什么? 到目前为止,我已经提出了try / except块检查,如果我可以切片零项,即。 OBJ [0:0]
编辑:
由于没有提供足够的信息,我似乎已经在下面开始了一场口水战。 为了完整性,让我提供更多细节,以便我可以挑选并获得最佳答案:
我在Python 2.6上运行Django,我正在编写一个可以接受Django模型实例或查询集对象并对其执行操作的函数,其中一个函数涉及使用需要列表的过滤器'in'(查询集输入) ),或者如果它不是列表,那么我会使用'get'过滤器(django get过滤器)。
在这种情况下,您通常需要检查任何可迭代的,而不仅仅是列表 - 如果您接受列表或数字,拒绝(例如)元组将是奇怪的。 您可能想要将其视为“标量”的一种可迭代是字符串 - 在Python 2. *中,这意味着str
或unicode
。 那么,要么:
def isNonStringIterable(x):
if isinstance(x, basestring):
return False
try: iter(x)
except: return False
else: return True
或者,通常更方便:
def makeNonStringIterable(x):
if isinstance(x, basestring):
return (x,)
try: return iter(x)
except: return (x,)
你for i in makeNonStringIterable(x): ...
去哪里for i in makeNonStringIterable(x): ...
if isinstance(your_object, list):
print("your object is a list!")
这比使用类型检查更像Pythonic。
似乎也更快:
>>> timeit('isinstance(x, list)', 'x = [1, 2, 3, 4]')
0.40161490440368652
>>> timeit('type(x) is list', 'x = [1, 2, 3, 4]')
0.46065497398376465
>>>
你没有。
这仅适用于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()
我不想成为害虫,但是:你确定查询集/对象是一个好的界面吗? 制作两个功能,例如:
def fobject(i):
# do something
def fqueryset(q):
for obj in q:
fobject( obj )
可能不是从列表中识别int的pythonic方法,但对我来说似乎是一个更好的设计。
原因是 :你的功能应该是鸭子。 只要它嘎嘎叫,就打它了。 实际上是把鸭子捡起来,把它翻过来检查肚子上的标记,然后再选择合适的球杆进行打击,这是非常的 。 抱歉。 只是不要去那里。
您可以使用isinstance
检查变量类型:
if isinstance(param, list):
# it is a list
print len(list)
我认为OP正在做的方式,检查它是否支持他想要的东西,是可以的。
在这种情况下更简单的方法是不检查列表,根据定义可以是多种类型,您可以检查输入是否为数字,在其上执行某些操作,否则尝试将其用作列表,如果它抛出异常保释。
例如,你可能不希望迭代列表,但只是想要添加一些东西,如果它是列表,否则添加到它
def add2(o):
try:
o.append(2)
except AttributeError:
o += 2
l=[]
n=1
s=""
add2(l)
add2(n)
add2(s) # will throw exception, let the user take care of that ;)
所以底线是答案可能会有所不同取决于你想用对象做什么
只需使用类型方法? 或者我是否误解了这个问题
if type(objectname) is list:
do something
else:
do something else :P
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.