__qualname__ 不等于完整导入路径,因为它仅表示定义时的嵌套作用域名称(如Outer.Inner),不含模块信息;完整路径需拼接__module__与__qualname__,但需校验有效性并处理交互式定义、动态类型等不可导入情形。

__qualname__ 本身不提供“完整路径”,它只返回从模块顶层到该对象的**作用域链名称**,不含模块名。想拼出可导入的完整路径,必须手动拼接 __module__。
为什么 __qualname__ 不等于完整导入路径?
__qualname__ 描述的是定义时的嵌套结构,比如类在函数内、嵌套类中,或作为局部变量存在——这些都无法直接 import。它和 __name__ 的区别在于保留了嵌套层级(如 Outer.Inner),但依然缺失模块信息。
常见误解是以为 A.B.__qualname__ 就是 "A.B",但若 B 定义在 mylib.utils 模块里,实际导入路径是 mylib.utils.B,而 __qualname__ 根本不提 mylib.utils。
如何安全拼出可导入的完整路径?
必须组合 obj.__module__ 和 obj.__qualname__,且需验证二者都存在、非空,并处理特殊值:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
__module__可能为None(如交互式环境定义的类)或"__builtin__"/"builtins" -
__qualname__对模块级函数/类是名字本身(如"MyClass"),对嵌套类是点分形式(如"Outer.Inner") - 若
__module__ == "__main__",说明不在已安装包中,拼出的路径不可跨进程复用
简单拼接示例:
def get_import_path(obj):
mod = getattr(obj, "__module__", None)
qual = getattr(obj, "__qualname__", None)
if mod is None or qual is None:
return None
return f"{mod}.{qual}"
哪些对象不能靠 __qualname__ 得到有效路径?
以下情况即使拼了 __module__ + __qualname__,结果也无法 import:
- 交互式解释器中定义的类(
__module__ == "__console__"或None) - 动态生成的类型(如
type("Foo", (), {})),其__module__默认为"__builtin__",但实际没被导入 - 装饰器包装后的函数,
__qualname__可能带或匿名标记,如"outer.—— 这种根本不可导入.inner" - 某些 C 扩展类(如
numpy.ndarray)的__qualname__是"ndarray",但它的真正构造器不在numpy.ndarray模块路径下暴露
真正可靠的“完整路径”只存在于已安装、被 Python 导入机制识别的模块中;__qualname__ 是辅助调试和反射的线索,不是导入地址生成器。别把它当 importlib.util.resolve_name 用。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










