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

Django непосредственно не обрабатывает поколение динамического контента (конкретно zip-файлы). Та работа была бы сделана стандартной библиотекой Python. Можно смотреть на то, как динамично создать zip-файл в Python здесь .

, Если Вы волнуетесь по поводу этого замедляющий Ваш сервер, можно кэшировать запросы, если Вы ожидаете иметь многие из тех же запросов. Можно использовать Django платформа кэша для помощи Вам с этим.

В целом, архивируя файлы может быть интенсивный ЦП, но Django не должен быть немного медленнее, чем другая веб-платформа Python.

10
задан 23 September 2009 в 08:04
поделиться

7 ответов

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

где вы просто переходите для i в makeNonStringIterable (x): ...

21
ответ дан 3 December 2019 в 13:34
поделиться
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
>>> 
13
ответ дан 3 December 2019 в 13:34
поделиться

Нет.

Это работает только для 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()
11
ответ дан 3 December 2019 в 13:34
поделиться

Вы можете использовать isinstance для проверки типа переменных:

if isinstance(param, list):
   # it is a list
   print len(list)
1
ответ дан 3 December 2019 в 13:34
поделиться

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

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

0
ответ дан 3 December 2019 в 13:34
поделиться

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

if type(objectname) is list:
  do something
else:
  do something else :P
-3
ответ дан 3 December 2019 в 13:34
поделиться

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

def fobject(i):
   # do something

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

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

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

2
ответ дан 3 December 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: