是否有一种可接受的方法从全局命名空间导入所有不是"来自模块导入*"

时间:2017-01-13 19:42:47

标签: python python-2.7

我有一个小应用程序,我想分成模块,以便我的代码更好的结构和可读性。这样做的缺点是我使用导入的每个模块:

import module

然后我必须将module.object用于我想从该模块访问的任何对象。

在这种情况下,我不想污染全局命名空间,我想用适当的模块名称填充它,以便我不必使用

from module import *

为了在没有模块前置的情况下调用对象。

有没有办法做到这一点,不考虑从导入或导入中使用不当?

3 个答案:

答案 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

这样,特定函数的本地命名空间用模块中的值填充,但全局的命名空间是干净的。