【问题标题】:Python custom module name not definedPython 自定义模块名称未定义
【发布时间】:2021-03-10 03:50:21
【问题描述】:

我有一个名为“package”的自定义包和一个名为“module”的自定义模块,该模块在调用时有一个返回“test”的函数。当我导入我的包时:

from package import module

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

from package import *

或者

import package

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

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

def printTest():
    return("Test")

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

import package

print(module.printTest())

【问题讨论】:

  • 你能告诉我们module模块和package包中的代码以及你的调用方式吗?
  • 可能想这样称呼它package.module.printTest()
  • @Maurice 刚刚编辑了我的帖子以包含它
  • @downshift 这给了我一个错误 module 'package' has no attribute 'module'。
  • 如果你想在包中导入模块的功能,你可以写from package.module import function并使用function(),或者你可以写import package.module as pm并使用pm.function()。您不能使用 import package 这样的单个语句导入包的所有模块,这只会导入包目录中文件 __init__.py 的函数/方法。

标签: python python-3.x module package


【解决方案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()
    

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

希望对你有帮助!

【讨论】:

  • 您也可以使用from app import foo,然后foo.a() 将按预期工作。
猜你喜欢
  • 1970-01-01
  • 2018-12-28
  • 2015-08-09
  • 2012-05-27
  • 2020-07-11
  • 2014-11-30
  • 1970-01-01
  • 2013-06-09
  • 2021-10-18
相关资源
最近更新 更多