我无法告诉你有多少次我被意外地命名我的文件就像我正在尝试导入的东西一样,导致python导入文件。这个例子应该显示我正在谈论的内容(我的第一个例子不起作用)如果/是在PYTHONPATH中:
/foo
__init__.py
/test
foo.py
__init__.py
def do_thingy():
print "Swosh!"
foo.py
from foo import * # Whops! Self include. Happy debugging.
do_thingy() # Not imported. You fail.
当应用程序,模块,插件出现此错误时,django似乎无声地失败,并且调试方法(我被告知)是转到shell并导入所有内容,直到找到该内容为止那已经坏了。
递归导入是否有实际用途?
答案 0 :(得分:2)
不,没有用于导入自己的用途。但是也没有用两种东西可以用同一个名字输入的东西,所以没有必要检测你给出的情况并特别处理它。
答案 1 :(得分:2)
Python命名空间要求每个名称都是不同的。每次导入模块时,它总是导入到全局命名空间中。在前端,这些只是简单的任务。如果导入与已存在的名称冲突的内容,它将以静默方式替换分配了名称的引用。
每次重新分配变量时,你都不希望Python“提醒”你,为什么你希望它为模块导入做同样的事情呢?
案例:
import foo as bar
bar = None
猜猜是什么?您刚刚使用值bar
替换了分配给None
的模块对象。
最后,回答你的问题:递归导入永远不是一个好主意,因为它们最好是混淆,最糟糕的是危险。