在导入代码的各种方式中,与其他方式相比,有哪些方式更适合使用?此链接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
文件都是空的),我应该使用哪种导入方法,为什么?
最佳答案
首先,也是主要的导入规则:永远不要使用 from foo import *
。
这篇文章正在讨论周期性导入的问题,该问题今天仍然存在于结构不良的代码中。我不喜欢周期性进口;它们的存在是一个强烈的信号,表明某些模块做得太多,需要拆分。如果出于某种原因您需要使用无法重新排列的循环导入代码,import foo
是唯一的选择。
在大多数情况下,import foo
和 from foo import MyClass
之间没有太大区别。我更喜欢第二种,因为涉及的打字更少,但有几个原因我可能会使用第一种:
模块和类/值有不同的名称。当导入值的名称与模块无关时,读者可能很难记住特定导入的来源。
- 好:
import myapp.utils as utils; utils.frobncate()
- 好:
import myapp.utils as U; U.frobncate()
- 错误:
from myapp.utils import frobncate
- 好:
您正在从一个模块中导入大量值。保护您的手指和读者的眼睛。
- 错误:
from myapp.utils import frobnicate, foo, bar, baz, MyClass, SomeOtherClass, # yada yada
- 错误:
关于Python(和 Django)最佳导入实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1704058/