【问题标题】:Python: How to import part of a namespacePython:如何导入命名空间的一部分
【发布时间】:2010-11-16 13:32:41
【问题描述】:

我有一个这样的结构:

import a.b.c
a.b.c.foo()

这也有效:

from a.b import c
c.foo()

但这不起作用:

from a import b.c
b.c.foo()

也没有:

from a import b
b.c.foo()

如何进行导入以使b.c.foo() 工作?

【问题讨论】:

  • 您的代码需要 b.c.foo() 语法而不是 c.foo() 是否有特殊原因?
  • 是的,前缀真的很长,有很多嵌套的模块,但是导入 'c' 是命名空间冲突。
  • 好的,除此之外,假设编写 c.foo() 在语义上更正确,这样我们就无法绕过这个问题。
  • 使用from a.b import c as b_c 和类似的重命名更​​容易解决命名空间冲突。

标签: python import namespaces


【解决方案1】:

只需重命名:


from a.b import c as BAR

BAR.foo()

【讨论】:

    【解决方案2】:

    在您的“b”包中,您需要添加“import c”,以便它始终可以作为b 的一部分访问。

    【讨论】:

    • 那么 b 必须猜出你想在它上面使用的所有子模块?代码是c的,不应该有更好的办法吗?
    【解决方案3】:
    from a import b
    from a.b import c
    b.c = c
    

    【讨论】:

    • 不确定“monkeypatching the code”是什么意思——它是monkeypatching模块(包)b来弥补它显然没有导入自己的c子模块的事实。
    • 顺便说一句,中间名也可以用as 进行更改,当然,无论你是否将其重新设置为b.c
    【解决方案4】:
    import a.b.c
    from a import b
    b.c.foo()
    

    import 语句的顺序无关紧要。

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 2011-04-24
      • 1970-01-01
      • 2018-01-05
      • 2013-01-20
      • 2021-10-03
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多