8

如果我从命令行启动 python 并输入:

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

它给我打印了一个随机数(预期,非常好)。

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

如果我采用自定义标签,否则效果很好,但我包括

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

作为自定义标记的 .py 文件的前 2 行,每当我尝试打开使用该自定义标记的模板时都会收到错误消息:

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'>

通常是从其他地方进口的

Django 模板库有一个称为随机的过滤器,不知何故,它的优先级高于系统的随机。

任何人都可以推荐如何显式导入正确的 python 随机数吗?

4

3 回答 3

18

答案是……奇怪。

当我最初编写自定义标签时,我将其命名为random.py. 我很快意识到这个名字可能不好,并重命名randomchoice.py并删除了我的random.py文件。Python 保留了编译后的random.pyc文件,每当我这样做时,它就会被加载import random。我删除了我的 random.pyc 文件,问题就消失了。

于 2009-05-08T03:39:10.027 回答
5

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

于 2010-02-21T19:39:35.120 回答
2

自从我修补 Django 以来已经有一段时间了,但是如果 random.random 是一个“模块”,那么请尝试 random.random.random()。或者也许只是尝试随机()。你只是不知道幕后发生了什么样的黑客行为。

编辑

试试这个:

sys.path = [r"C:\Program Files\Python26\lib\"] + sys.path
import random
sys.path.pop(0)
于 2009-05-08T02:28:47.607 回答