为何Python模块函数需全限定名调用?包导入*后函数未定义求解
from <module> import *无法直接调用函数的问题 这个问题的核心在于你包的__init__.py里的__all__配置和导入逻辑没配合好,导致myfunc没有被暴露到包的顶层命名空间里。
为什么现在不行?
你的__init__.py里虽然写了from .testmodule import *,但同时设置了__all__ = ['testmodule']——这个__all__列表是专门用来定义当执行from <module> import *时,哪些名字会被导入到当前作用域的。现在它只包含了testmodule这个模块对象,所以你执行from test import *后,只有testmodule被导入,myfunc还是藏在testmodule里面,自然直接调用会报错。
两种解决方法
方法1:直接在包顶层暴露myfunc
修改test/__init__.py,把myfunc单独导入并加到__all__里:
from . import testmodule from .testmodule import myfunc # 单独导入myfunc到包顶层 __all__ = ['testmodule', 'myfunc'] # 把myfunc加入导出列表
这样执行from test import *后,myfunc就直接在当前作用域里了,你可以直接调用myfunc()。
方法2:批量导出testmodule里的所有函数
如果testmodule里有多个函数,你可以先在testmodule.py里定义哪些函数允许被导出:
# test/testmodule.py __all__ = ['myfunc'] # 定义这个模块允许导出的名字 def myfunc(): print('wew')
然后修改test/__init__.py,把testmodule的导出列表合并到包的__all__里:
from .testmodule import * from . import testmodule # 把testmodule的导出名字和testmodule本身都加入包的导出列表 __all__ = testmodule.__all__ + ['testmodule']
这样from test import *会导入testmodule.__all__里的所有函数(比如myfunc),同时保留testmodule模块对象,既可以直接调用myfunc(),也能通过testmodule.myfunc()调用。
额外提示
虽然from <module> import *在某些场景下方便,但在大型项目里不推荐使用——它会让命名空间变得混乱,难以追踪变量来源。如果只是想导入特定函数,更清晰的写法是from test import myfunc,这样可读性更好。
内容的提问来源于stack exchange,提问作者wewlie

