我正在尝试生成一个随机的三位数扩展名:
>>> ''.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
...
答案 0 :(得分:6)
您已将全局名称str
(通常是指字符串类型)替换为其他内容(很可能是包含不重要字符串的变量)。 Python通常不会将这些类型的事物视为关键字(在Python 3.x中,True
和False
已成为关键字,之前它们只是全局变量)。
也就是说,random.sample
选择非重复值,这似乎不是“生成随机三位数扩展”问题的要求。也没有避免零。我只需从0-999(包括0-999)中选择一个随机数并对其进行适当格式化('%03d'或新格式中的等效)。
答案 1 :(得分:4)
我已经在控制台中尝试了它并在.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
提供您报告的相同错误。
答案 2 :(得分: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
已设置为等于str
,错误就有意义。
In [62]: random.sample='1'
In [63]: random.sample(range(1,10),3)
TypeError: 'str' object is not callable