在阅读一些python代码时,我遇到了两种导入用户定义模块的方法。这两种在Python中导入模块的方式有什么区别?
第一个;
import config
第二个;
from config import *
两者有什么区别?如果两行代码都存在会发生什么?任何副作用?
在阅读一些python代码时,我遇到了两种导入用户定义模块的方法。这两种在Python中导入模块的方式有什么区别?
第一个;
import config
第二个;
from config import *
两者有什么区别?如果两行代码都存在会发生什么?任何副作用?
假设有一个名为unicorn
的模块,其全局内容为stack
,over
和flow
。
import unicorn
,这些都可以作为unicorn.stack
,unicorn.over
,并unicorn.flow
访问。import unicorn as U
,这些可以被访问为U.stack
,U.over
和U.flow
。from unicorn import stack
,则将stack
对象unicorn
复制到全局变量stack
中。from unicorn import *
,stack
和模块中的其他所有全局对象(名称以下划线开头的私有对象除外)复制到您的全局名称空间中。这可以很好,但以后对unicorn
模块的更新可能会添加导致程序意外运行的事情。例如,如果您有称为user
和server
的变量,则将来更新为unicorn
(其中添加了super
,user
,server
和fault
)可能会导致其行为异常。from unicorn import stack, over, flow
,只有你指定的东西被复制,并且即使在unicorn
中添加了更多的东西之后,你的程序也会继续工作。from unicorn import stack as H
,你会从unicorn
模块得到stack
,但是在你程序的全局命名空间中,它被称为H
。如果您经常使用某个特定的函数或变量,这可以帮助保持行数小于80个字符。代码
import config
只是导入模块名为config,如果你想使用它的方法,你需要使用类似myname = config.getName()
。
代码
from config import *
将导入一切由config
出口到当前的命名空间。现在,如果您想在config中使用getName方法,代码就像myname = getName()
我们总是使用第一种导入方式,因为您可以使用多个模块导出的具有相同名称的不同方法。例如,我们可以使用空两种getName
方法:
import config
import mydata
print config.getName()#print Jim
print mydata.getName()#print Tom
当您在第二种方法不喜欢它,最后导入代码将导入getName
方法代替你已经由第一导入代码导入一个:
from config import *
from mydata import *
print getName()#print Tom
所以你可以看到,当前命名空间被第二种方式污染了。
这是错误的,后者将不起作用,因为'config'和'mydata'没有在该空间中定义。他们不会打印任何东西,并且'print config.getName()'会抛出一个异常。 – 2014-12-11 02:56:57
@LegoStormtroopr对不起,我只是复制代码,不要修改它。:( – tianwei 2014-12-11 03:20:00
第二种方法会污染你当前的命名空间,几乎所有的东西都在config中。 – Marcin 2014-12-11 02:35:52
@Marcin:当我想使用像config.variable这样的config模块声明的变量时,'from config import *'不能工作。这是否意味着在这种情况下必须使用'import config',即使它是一个大污染物?有更好的方法来避免污染吗? – user781486 2014-12-11 02:42:49
在[python.org](https://docs.python.org/2/tutorial/modules.html#importing-from-a-package)上有一些相当不错的文档可用。投票不是我的,但是因为这些信息广泛存在,而且你没有提及其他任何地方,所以你可能会拒绝投票。 – Minnow 2014-12-11 02:45:14