Python(和Django)最佳导入做法
在导入代码的各种方式中,有没有比其他方式更可使用的方式?此链接http://effbot.org/zone/import-
confusion.htm简短说明
from foo.bar import MyClass
在通常情况下或除非您知道自己在做什么,否则不是导入MyClass的首选方法。(相反,更好的方法是:
import foo.bar as foobaralias
然后在代码中访问MyClass使用
foobaralias.MyClass
)
简而言之,似乎上面提到的链接表示 通常 最好从模块中导入所有内容,而不是仅导入模块中的一部分。
但是,我链接的那篇文章真的很老。
我还听说,至少在Django项目的上下文中,最好只导入要使用的类,而不是整个模块。据说这种形式有助于避免循环导入错误或至少使django导入系统不那么脆弱。有人指出,Django自己的代码似乎更喜欢“
from x import y”而不是“ import x”。
假设我正在从事的项目未使用…的任何特殊功能__init__.py
(我们的所有__init__.py
文件均为空),我应该采用哪种导入方法,为什么?
-
对我来说,这取决于情况。如果它是一个唯一命名的方法/类(即不是/不是
process()
这样的东西),并且您将要 大量
使用它,则保存输入内容,然后执行即可from foo import MyClass
。如果要从一个模块导入多个内容,则最好只是导入该模块,然后执行do
module.bar, module.foo, module.baz
等以保持名称空间整洁。你也说过
据说这种形式有助于避免循环导入错误或至少使django导入系统不那么脆弱。有人指出,Django自己的代码似乎更喜欢“ from x import
y”而不是“ import x”。我不知道一种方式或另一种方式将有助于防止循环进口。原因是,即使执行此操作
from x import y
,也将全部x
导入。仅y
将其带入当前名称空间,但整个模块x
都将处理。试试这个例子:在test.py中,输入以下内容:
def a(): print "a" print "hi" def b(): print "b" print "bye"
然后在“ runme.py”中输入:
from test import b b()
然后就做
python runme.py
您将看到以下输出:
hi bye b
因此,即使您仅导入了test.py中的所有内容,
b