You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:50:49