【问题标题】:What is the difference, if any, between these 2 ways of importing modules in python?这两种在 python 中导入模块的方式之间有什么区别(如果有的话)?
【发布时间】:2014-12-11 02:30:54
【问题描述】:

在阅读一些python代码时,我遇到了两种导入自定义模块的方法。

第一个;

import config

第二个;

from config import *

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

【问题讨论】:

  • 第二种方式将污染您当前的命名空间,几乎所有配置中的内容。
  • @Marcin:当我想使用像 config.variable 这样在配置模块中声明的变量时,from config import * 无法工作。这是否意味着在这种情况下必须使用import config,即使它是一种大污染物?有没有更好的方法来避免污染?
  • python.org 上提供了一些相当不错的文档和示例。否决票不是我的,但由于此信息广泛可用,而且您没有提及在其他任何地方寻找它,您可能会吸引反对票。
  • from config import * 可能不会导入所有内容。默认情况下,不会导入私有变量(即以单下划线开头的变量)。

标签: python python-2.7


【解决方案1】:

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

  • 如果您使用import unicorn,则可以通过unicorn.stackunicorn.overunicorn.flow 访问它们。
  • 如果您使用import unicorn as U,则可以通过U.stackU.overU.flow 访问它们。
  • 如果您执行from unicorn import stack,则来自unicornstack 对象将复制到全局变量stack
  • 如果您执行from unicorn import *stack 和模块中的其他所有全局对象(名称以下划线开头的私有对象除外),将被复制到您的全局命名空间中。这可能没问题,但是以后对unicorn 模块的更新可能会添加一些导致您的程序出现意外行为的内容。例如,如果您有名为 userserver 的变量,将来对 unicorn 的更新会添加 superuserserverfault 可能会导致其行为不端。
  • 如果您执行from unicorn import stack, over, flow,则只会复制您指定的那些内容,即使在unicorn 添加更多内容后,您的程序也会继续运行。
  • 如果你使用from unicorn import stack as H,你会从unicorn 模块中得到stack,但是在你程序的全局命名空间中它被称为H。如果您经常使用特定函数或变量,这有助于将行数控制在 80 个字符以内。

【讨论】:

    【解决方案2】:

    代码

    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
    

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

    【讨论】:

    • 这是错误的,因为configmydata 没有在该空间中定义,所以后者不起作用。他们不会打印任何东西,print config.getName() 会抛出异常。
    • @LegoStormtroopr 很抱歉我只是复制代码,不要修改它。:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    相关资源
    最近更新 更多