繁体   English   中英

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

[英]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. *中,这意味着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): ...去哪里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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM