在阅读一些python代码时,我遇到了两种导入用户定义模块的方法。
第一个;
import config
第二个;
from config import *
两者有什么区别?如果两行代码都存在会发生什么?有副作用吗?
答案 0 :(得分:4)
假设有一个名为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
,则会从stack
模块获得unicorn
,但在您的计划的全局命名空间中,它会被称为H
。如果您经常使用特定的功能或变量,这可以帮助您保持80行以下的字符。答案 1 :(得分:-1)
代码
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
所以你可以看到,当前的命名空间被第二种方式污染了。