【问题标题】:How do you import two modules using the same name?如何使用相同的名称导入两个模块?
【发布时间】:2015-09-25 09:17:20
【问题描述】:

两个模块:

#foo.py
def foo():
    print("foo")

和

#bar.py
def bar():
    print("bar")

我想导入两个模块并将它们放在同一个命名空间中,如下所示(不起作用):

import foo as a
import bar as a

a.foo()  # Error :(
a.bar()

如何让它发挥作用?

【问题讨论】:

  • 为什么不能将 foo 作为 a 和 bar 作为 b 导入?
  • 因为如果两者具有相同的名称会更好。例如:import tkinter as tk 和 import bwidget as tk
  • 为什么会更好?如果两个模块都有同名的函数怎么办?
  • 这是个糟糕的主意
  • 将 2 个(或更多)任意 3rd 方模块组合到一个命名空间中会导致灾难,原因已经提到。但是,存在这样一种情况:当您创建了一个由多个源文件中定义的组件组成的包时,并且您希望将所有这些组件导入一个命名空间中。当然,您仍然必须小心,以免意外造成名称冲突。

标签: python python-3.x python-import


【解决方案1】:

您可以创建一个包含两者的新模块。但是请注意,任何在两个模块中似乎具有相同名称的函数/类/任何东西都只会被定义为最后一个导入模块中的一个:

merger.py

from foo import *
from bar import *

your_code.py

import merger as a

a.foo()
a.bar()

更不用说追踪 a.foobaz() 调用最初定义的位置的困难了。

【讨论】:

    【解决方案2】:
    import foo as a
    import bar
    
    # alias everything, you can use `bar.__all__` to automate this
    a.bar = bar.bar
    
    a.foo()
    a.bar()
    

    但是,我建议不要这样做,因为这会给您的代码的未来维护者带来麻烦。

    【讨论】:

    • 感谢您的回答,这只是我的一个想法,我认为它会让事情变得更容易。
    【解决方案3】:

    在第一次导入时,您将 foo 分配给“a”,就像一个值一样。 在第二次导入中,您使用 bar 覆盖它。这就是错误的原因。

    回答您的问题 - 您不能为单个变量分配多个值,除非它是字典、列表、元组等。

    当您覆盖一个变量时,您会为其分配一个新值,而不是同时保留这两个值。这就是您的导入所发生的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 2019-10-29
      • 1970-01-01
      相关资源
      最近更新 更多