我有一个可能包含数字或数字列表的函数。什么是最pythonic方式检查它是什么?到目前为止,我已经提出了try / except块检查,如果我可以切片零项,即。 OBJ [0:0]
编辑:
由于没有给出足够的信息,我似乎已经在下面开始了一场口水战。为了完整性,让我提供更多细节,以便我可以挑选并获得最佳答案:
我在Python 2.6上运行Django并且我正在编写一个可以接受Django模型实例或查询集对象并对其执行操作的函数,其中一个涉及使用需要列表的过滤器'in'(查询集输入),或者如果它不是列表,那么我会使用'get'过滤器(django get过滤器)。
答案 0 :(得分:21)
在这种情况下,你通常需要检查任何可迭代的,而不仅仅是列表 - 如果你接受列表或数字,拒绝(例如)一个元组会很奇怪。您可能希望将其视为“标量”的一种可迭代是字符串 - 在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): ...
答案 1 :(得分:13)
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
>>>
答案 2 :(得分:11)
你没有。
这仅适用于Python> = 2.6。如果您定位的是以下任何内容,请使用Alex' solution。
Python支持名为Duck Typing的东西。您可以使用ABC classes查找某些功能。
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()
答案 3 :(得分:2)
我不想成为害虫,但是:你确定查询集/对象是一个好的界面吗?制作两个函数,例如:
def fobject(i):
# do something
def fqueryset(q):
for obj in q:
fobject( obj )
可能不是 pythonic 从列表中识别int的方法,但对我来说似乎是一个更好的设计。
原因:您的函数应该处理ducks。只要它嘎嘎叫,就打它了。实际上是把鸭子捡起来,把它翻过来检查肚子上的标记,然后选择合适的球杆敲打它是 unpythonic 。抱歉。只是不要去那里。
答案 4 :(得分:1)
您可以使用isinstance
检查变量类型:
if isinstance(param, list):
# it is a list
print len(list)
答案 5 :(得分:0)
我认为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 ;)
所以答案的底线可能因你想用对象做什么而有所不同
答案 6 :(得分:-3)
只需使用类型方法?或者我是否误解了这个问题
if type(objectname) is list:
do something
else:
do something else :P