未定义 Python 自定义模块名称

新手上路,请多包涵

我有一个名为“package”的自定义包,该包中有一个名为“module”的自定义模块,它有一个在调用时返回“test”的函数。如果我这样做,当我导入我的包裹时:

 from package import module

一切正常,但如果我这样做:

 from package import *

或者

import package

然后,当尝试使用“模块”模块时,它会出现错误名称“模块”未定义。为什么在我使用 import * 或导入包时没有导入模块?

我试图调用的模块中的代码是这样的:

 def printTest():
    return("Test")

调用模块的文件中的代码是这样的:

 import package

print(module.printTest())

原文由 BSmith156 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 778
1 个回答

这是一个令人惊讶的普遍问题,这个问题仍然没有正确的答案,所以我们开始吧。

假设我们有一个只有内部函数的模块,比如说:

  • 文件 app/foo.py
     def a():
        print('Hello from foo.a')

    def b():
        print('Hello from foo.b')

我真的希望这能起作用(但它 不会):

  • 文件 app/bar.py
     import app.foo

    # These will not work!
    foo.a()
    foo.b()

事实证明,您必须显式导入每个元素或给 app.foo 一个名称:

  • 导入所有内容(通常被认为是不好的做法):
     from app.foo import *

    # Both will work fine
    a()
    b()

  • 只导入你想要的:
     from app.foo import b

    # This will work
    b()

    # But this will not
    a()

  • app.foo 一个(好听的)名字:
     import app.foo as baz

    # Both will work as expected
    baz.a()
    baz.b()

即使上面的示例仅使用函数,它对于在模块最顶层范围内声明的所有内容(如类或变量)也完全相同。

希望能帮助到你!

原文由 Victor Schröder 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题