当在自定义模板标签中使用python random.random()时,会出现“'module' object is not callable”错误。

8
如果我从命令行开始使用Python并输入以下内容:
import random
print "Random: " + str(random.random())

它会输出一个随机数(预期的,很好)。

如果我在我的Django应用程序的models.py中包含以上两行代码,并使用runserver启动我的Django应用程序,我将在命令行上看到输出一个随机数(太棒了!)

但是,如果我使用一个本来完全正常的自定义标签,但是我在其中包含

import random
print "Random: " + str(random.random())

作为自定义标签.py文件的前两行,每当我尝试打开使用该自定义标签的模板时,就会出现错误:
TypeError at /help/
'module' object is not callable

请记住,如果我删除这两行,则我的自定义标签将按预期方式运行,不会出现错误。不幸的是,我需要在模板标记内部进行一些随机行为。
问题在于,如果在自定义标记中执行以下操作:
import random

在一个自定义模板标签中,它导入了。
<module 'django.templatetags.random' from '[snip path]'> 

而不是

<module 'random' from 'C:\\Program Files\\Python26\\lib\\random.pyc'>

通常情况下,from导入模块可以从任何地方导入。

Django模板库有一个名为random的过滤器,但不知何故,它优先于系统的随机函数。

是否有人能推荐如何显式导入正确的python随机函数?


尝试:from random import random - jfs
对我来说,以下代码可行:import numpy.random as randMe - Black Diamond
3个回答

18

答案有点奇怪。

当我最初编写自定义标签时,我将其命名为 random.py。但我很快意识到这个名称可能不太好,并将其重命名为 randomchoice.py,并删除了我的 random.py 文件。 Python 仍然保留着已编译的 random.pyc 文件,并在每次执行 import random 时加载它。我删除了 random.pyc 文件,问题就解决了。


5

是的,这种错误很容易发生。基本上不要使用与您将要使用的任何可能的Python模块相同的名称来命名您的任何文件或创建的任何内容。


2

我已经有一段时间没有涉及Django了,但是如果random.random是一个“模块”,那么尝试random.random.random()。或者只需尝试random()。你不知道在幕后发生了什么样的黑客行为。

编辑

尝试这个:

sys.path = [r"C:\Program Files\Python26\lib\"] + sys.path
import random
sys.path.pop(0)

谢谢您的见解。我尝试了所有方法,接着我又尝试打印出导入的确切模块是哪一个。这为问题添加了重要的见解,我已经在主贴中包含了它。 - Krystian Cybulski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接