Подтвердить что ты не робот

Что такое pythonic способ проверки, является ли объект списком?

У меня есть функция, которая может принимать число или список чисел. Какой самый питонический способ проверить, что это такое? До сих пор я придумал try/except block check, если я могу нарезать нулевой элемент, т.е. OBJ [0: 0]

Edit:

Кажется, я начал войну слов ниже, не давая достаточно информации. Для полноты позвольте мне предоставить более подробную информацию, чтобы я мог выбрать и получить лучший ответ для моей ситуации:

Я запускаю Django на Python 2.6, и я пишу функцию, которая может принимать экземпляр модели Django или объект запроса и выполнять операции над ним, один из которых включает использование фильтра "in", для которого требуется список ( вход запроса запроса) или поочередно, если это не список, тогда я бы использовал фильтр get (фильтр django get).

4b9b3361

Ответ 1

В таких ситуациях вам обычно нужно проверять ЛЮБЫЕ итерационные, а не только списки - если вы принимаете списки ИЛИ номера, отклоняя (например), кортеж был бы странным. Один из возможных вариантов, который вы можете рассматривать как "скаляр", - это строка - в 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): ...

Ответ 2

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
>>> 

Ответ 3

Нет.

Это работает только для 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()

Ответ 4

Я не хочу быть вредителем, НО: Вы уверены, что набор/объект запроса - хороший интерфейс? Сделайте две функции, например:

def fobject(i):
   # do something

def fqueryset(q):
   for obj in q:
       fobject( obj )

Не может быть питоническим способом распознать int из списка, но для меня это выглядит намного лучше.

Причина. Ваша функция должна работать на уток. Пока он обманывает, ударяйте его. На самом деле собирать утку вверх, переворачивая ее вверх дном, чтобы проверить маркировку на животе, прежде чем выбрать правильный клуб, чтобы он ударил, он бесстрашный. Сожалею. Просто не ходите туда.

Ответ 5

Вы можете использовать isinstance, чтобы проверить тип переменных:

if isinstance(param, list):
   # it is a list
   print len(list)

Ответ 6

Я думаю, что способ 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 ;)

Итак, нижняя строка ответа может отличаться в зависимости от того, что вы хотите делать с объектом

Ответ 7

Просто используйте метод типа? Или я неверно истолковываю вопрос

if type(objectname) is list:
  do something
else:
  do something else :P