繁体   English   中英

是否有一种从全局名称空间导入全部而不是“从模块导入*”的方式?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM