Ошибка типа при извлечении случайных цифр

#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: разделение большой строки на несколько строк меньшего размера, чтобы более точно определить, где что-то идет не так, является очень полезным методом для отладки.