2014-12-11 86 views
-1

在阅读一些python代码时,我遇到了两种导入用户定义模块的方法。这两种在Python中导入模块的方式有什么区别?

第一个;

import config 

第二个;

from config import * 

两者有什么区别?如果两行代码都存在会发生什么?任何副作用?

+6

第二种方法会污染你当前的命名空间,几乎所有的东西都在config中。 – Marcin 2014-12-11 02:35:52

+0

@Marcin:当我想使用像config.variable这样的config模块声明的变量时,'from config import *'不能工作。这是否意味着在这种情况下必须使用'import config',即使它是一个大污染物?有更好的方法来避免污染吗? – user781486 2014-12-11 02:42:49

+1

在[python.org](https://docs.python.org/2/tutorial/modules.html#importing-from-a-package)上有一些相当不错的文档可用。投票不是我的,但是因为这些信息广泛存在,而且你没有提及其他任何地方,所以你可能会拒绝投票。 – Minnow 2014-12-11 02:45:14

回答

4

假设有一个名为unicorn的模块,其全局内容为stack,overflow

  • 如果你这样做import unicorn,这些都可以作为unicorn.stackunicorn.over,并unicorn.flow访问。
  • 如果你做import unicorn as U,这些可以被访问为U.stack,U.overU.flow
  • 如果您做的是from unicorn import stack,则将stack对象unicorn复制到全局变量stack中。
  • 如果您将from unicorn import *stack和模块中的其他所有全局对象(名称以下划线开头的私有对象除外)复制到您的全局名称空间中。这可以很好,但以后对unicorn模块的更新可能会添加导致程序意外运行的事情。例如,如果您有称为userserver的变量,则将来更新为unicorn(其中添加了super,user,serverfault)可能会导致其行为异常。
  • 如果你这样做from unicorn import stack, over, flow,只有你指定的东西被复制,并且即使在unicorn中添加了更多的东西之后,你的程序也会继续工作。
  • 如果你做from unicorn import stack as H,你会从unicorn模块得到stack,但是在你程序的全局命名空间中,它被称为H。如果您经常使用某个特定的函数或变量,这可以帮助保持行数小于80个字符。
-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 

所以你可以看到,当前命名空间被第二种方式污染了。

+0

这是错误的,后者将不起作用,因为'config'和'mydata'没有在该空间中定义。他们不会打印任何东西,并且'print config.getName()'会抛出一个异常。 – 2014-12-11 02:56:57

+0

@LegoStormtroopr对不起,我只是复制代码,不要修改它。:( – tianwei 2014-12-11 03:20:00

相关问题