我有一个小应用程序,我想分成模块,以便我的代码更好的结构和可读性。这样做的缺点是我使用导入的每个模块:
import module
然后我必须将module.object用于我想从该模块访问的任何对象。
在这种情况下,我不想污染全局命名空间,我想用适当的模块名称填充它,以便我不必使用
from module import *
为了在没有模块前置的情况下调用对象。
有没有办法做到这一点,不考虑从导入或导入中使用不当?
答案 0 :(得分:5)
两个合理的选项是使用较短的名称导入前置。 E.g。
import module as m
m.foo()
或明确导入您计划使用的名称:
from module import (foo,bar)
foo()
答案 1 :(得分:2)
您应该始终避免在导入中使用星号。所以要回答你的问题,我会说不,没有比这更好的方式:
?data.table
OR
import module
module.method()
看看pep8指南" Imports"部分: https://www.python.org/dev/peps/pep-0008/#imports
应该避免使用通配符导入(来自import *),因为它们不清楚命名空间中存在哪些名称,这会使读者和许多自动化工具混淆。通配符导入有一个可防御的用例,即将内部接口重新发布为公共API的一部分(例如,使用可选加速器模块中的定义覆盖接口的纯Python实现,以及确切的定义将是被覆盖的事先不知道。
具体比全球化更安全,我尝试只导入我需要的东西,如果我可以帮助它。当我学习一个新模块时,我将导入整个模块,然后一旦它处于良好状态,我会通过专门导入我需要的方法返回并重构:
import really_long_module_name as mm
mm.method()
答案 2 :(得分:0)
我不得不说你应该使用模块的名称。这是一种更好的使用方式,使您的代码不受命名空间混淆,也非常容易理解。
为了使您的代码更美观,您可以使用as
导入:
import random as r
# OR
from random import randint as rint
一个解决方案我认为不是很漂亮,但是想到了,如果您不想污染全局命名空间,您可以尝试使用导入语句,例如,在函数内部。
例如:
>>> def a():
... from random import randint
... x = randint(0,2)
... print x
...
>>> a()
1
>>> randint(0,2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'randint' is not defined
这样,特定函数的本地命名空间用模块中的值填充,但全局的命名空间是干净的。