#python
#python
Вопрос:
Я пытаюсь сгенерировать случайное трехзначное расширение:
>>> ''.join(str(x) for x in random.sample(range(1,10),3))
Это работает в приглашении. Однако, когда я запускаю программу, она вызывает TypeError: str object is not callable
. Это строка, которая у меня есть:
filename = hashlib.md5(imagefile.getvalue()).hexdigest()
''.join(str(x) for x in random.sample(range(1,10),3)) '_thumb' '.jpg'
Что я здесь делаю не так и как мне это исправить?
Спасибо за помощь. Ранее я вызывал str в коде, что вызывало ошибку:
str=""
for c in i.chunks():
str = c
...
Комментарии:
1. Вы уверены, что это то, что выдает вам ошибку? Не похоже, что в этом что-то не так.
Ответ №1:
Вы заменили глобальное имя str
, которое обычно относится к строковому типу, на что-то другое (скорее всего, переменную, содержащую строку, не имеющую большого значения). Python обычно не рассматривает подобные вещи как ключевые слова (в Python 3.x True
и False
стали ключевыми словами, где раньше они были просто глобальными переменными).
Тем не менее, random.sample
выбирает неповторяющиеся значения, что не похоже на требование для задачи «сгенерировать случайное трехзначное расширение». Как и избегание нулей. Я бы просто выбрал одно случайное число от 0-999 включительно и соответствующим образом отформатировал его (‘d’ или эквивалент в новом форматировании).
Ответ №2:
Я пробовал это как в консоли, так и вызывая его в файле .py, и оба работают.
Вы уверены, что не объявляете переменную с именем «str» где-нибудь в своем коде перед этим вызовом?
Это работает:
import random
filename= ''.join(str(x) for x in random.sample(range(1,10),3))
print filename
Это:
import random
str = ''
filename= ''.join(str(x) for x in random.sample(range(1,10),3))
print filename
Выдайте ту же ошибку, о которой вы сообщаете.
Ответ №3:
Я бы разбил оператор на более мелкие части:
val=imagefile.getvalue()
m=hashlib.md5(val)
sample=random.sample(range(1,10),3)
r=''.join(str(x) for x in sample)
filename = '{m}{r}_thumb.jpg'.format(m=m.hexdigest(),r=r)
так что в сообщении обратной трассировки будет указано, какая часть вызывает исключение.
Временная инструкция печати или использование отладчика позволят еще больше сузить проблему.
PS. Просто предположение, но ошибка имела бы смысл, если random.sample
бы была установлена равной a str
.
In [62]: random.sample='1'
In [63]: random.sample(range(1,10),3)
TypeError: 'str' object is not callable
Комментарии:
1. Для чего, черт возьми? Сообщение довольно четкое и
str
появляется в коде только один раз, поэтому виновник уже обнаружен.2. @Karl Knechtel: Вы, вероятно, правы, что
str
было перезаписано, а неrandom.sample
. Но вы неправильно интерпретируете сообщение об ошибке. Это не говорит о том, что встроенныйstr
компонент был перезаписан, только о том, чтоstr
вызывается объект. Все, что предшествует paretheses, является возможным виновником.3. @Karl: то, что он предлагает, является вполне допустимой возможностью, хотя то, что вы говорите, на порядки более вероятно.
4. 1: разделение большой строки на несколько строк меньшего размера, чтобы более точно определить, где что-то идет не так, является очень полезным методом для отладки.