检查对象是否为列表的pythonic方法是什么?

时间:2009-09-23 04:54:10

标签: python list

我有一个可能包含数字或数字列表的函数。什么是最pythonic方式检查它是什么?到目前为止,我已经提出了try / except块检查,如果我可以切片零项,即。 OBJ [0:0]

编辑:

由于没有给出足够的信息,我似乎已经在下面开始了一场口水战。为了完整性,让我提供更多细节,以便我可以挑选并获得最佳答案:

我在Python 2.6上运行Django并且我正在编写一个可以接受Django模型实例或查询集对象并对其执行操作的函数,其中一个涉及使用需要列表的过滤器'in'(查询集输入),或者如果它不是列表,那么我会使用'get'过滤器(django get过滤器)。

7 个答案:

答案 0 :(得分:21)

在这种情况下,你通常需要检查任何可迭代的,而不仅仅是列表 - 如果你接受列表或数字,拒绝(例如)一个元组会很奇怪。您可能希望将其视为“标量”的一种可迭代是字符串 - 在Python 2. *中,这意味着strunicode。所以,要么:

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