![](/img/trans.png)
[英]Is there an accepted way in Python to import a module from within a function?
[英]Is there an accepted way to import all from the global namespace that is not “from module import *”
我有一个小应用程序,希望将其拆分为模块,以使我的代码具有更好的结构和可读性。 这样做的缺点是,对于使用以下命令导入的每个模块:
import module
然后,我必须对要从该模块访问的任何对象使用module.object。
在这种情况下,我不想污染全局名称空间,我想用适当的模块名称填充它,这样我就不必使用
from module import *
为了在没有模块前缀的情况下调用对象。
有没有一种方法可以做到这一点,而又不认为是对进口或进口的不当使用?
有两个合理的选择是使用短名称开头。 例如
import module as m
m.foo()
或显式导入您打算使用的名称:
from module import (foo,bar)
foo()
您应该始终避免在导入文件中使用星号。 因此,要回答您的问题,我会说不,没有比这更好的方法了:
import module
module.method()
要么
import really_long_module_name as mm
mm.method()
在这里查看pep8指南的“导入”部分: https ://www.python.org/dev/peps/pep-0008/#imports
应避免使用通配符导入(从import *),因为通配符使不清楚名称空间中存在哪些名称,从而使阅读器和许多自动化工具感到困惑。 通配符导入有一个合理的用例,它是将内部接口重新发布为公共API的一部分(例如,用可选的加速器模块中的定义覆盖接口的纯Python实现,以及确切的定义是事先未知)。
特定于安全性要比遍历安全,我会尽力仅导入需要的内容。 当我学习一个新模块时,我将导入整个内容,然后一旦它处于良好状态,我将通过专门导入所需的方法返回并进行重构:
from module import method
method()
我不得不说您应该使用模块的名称。 这是一种更好的用法,它使您的代码摆脱名称空间的混乱,并且也很容易理解。
为了使代码更漂亮,可以使用as
导入:
import random as r
# OR
from random import randint as rint
我想到的一种解决方案并不是很漂亮,但是可以想到,如果您不想污染全局名称空间, 可以尝试使用import语句,例如内部函数。
例如:
>>> 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
这样,特定函数的本地名称空间被模块中的值填充,但是全局名称空间是干净的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.