Django непосредственно не обрабатывает поколение динамического контента (конкретно zip-файлы). Та работа была бы сделана стандартной библиотекой Python. Можно смотреть на то, как динамично создать zip-файл в Python здесь .
, Если Вы волнуетесь по поводу этого замедляющий Ваш сервер, можно кэшировать запросы, если Вы ожидаете иметь многие из тех же запросов. Можно использовать Django платформа кэша для помощи Вам с этим.
В целом, архивируя файлы может быть интенсивный ЦП, но Django не должен быть немного медленнее, чем другая веб-платформа Python.
В таких ситуациях вам обычно нужно проверять ЛЮБУЮ итерацию, а не только списки - если вы принимаете списки ИЛИ числа, отклонение (например) кортежа было бы странным. Единственный вид итераций, которые вы можете рассматривать как «скаляр», - это строка - в 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): ...
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()
Вы можете использовать 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
Я не хочу быть вредителем, НО: Вы уверены, что набор / объект запроса - хороший интерфейс? Сделайте две функции, например:
def fobject(i):
# do something
def fqueryset(q):
for obj in q:
fobject( obj )
Возможно, это не питонический способ отличить int из списка, но мне кажется, что это намного лучший дизайн.
Причина : Ваша функция должна работать над утками. Пока он крякает, бей его. На самом деле, поднимать утку, переворачивать ее вверх дном, чтобы проверить отметки на животе, прежде чем выбрать правильную дубинку, чтобы ударить ее, непифонично . Сожалею. Только не ходи туда.