能否仅传入Property对象获取其完全限定名称?
需求可行性分析与实现思路
你的需求完全可行,Python的内省机制足以支持提取各类对象的完全限定名,进而对接你的帮助页面后端,并非理想化的目标。
核心实现思路
针对不同类型的对象,可通过Python内置的inspect模块及对象的特殊属性来提取完全限定名:
- 模块:直接使用
obj.__name__即可得到完整模块名(如ooolib.foo)。 - 类:拼接
obj.__module__(所属模块)与obj.__name__(类名),得到{模块名}.{类名}(如ooolib.foo.Foo)。 - 方法(包括
__init__):利用obj.__qualname__(包含类与方法的层级名称)结合obj.__module__,拼接为{模块名}.{层级名称}(如ooolib.foo.Foo.__init__)。 - Property与类属性:
- 通过
obj.__objclass__获取属性所属的类; - 遍历类的成员,匹配到当前对象对应的名称;
- 拼接模块名、类名与属性名,得到完整限定名。
- 通过
简化实现示例
import inspect def get_qualified_name(obj): # 处理模块对象 if inspect.ismodule(obj): return obj.__name__ # 处理类对象 if inspect.isclass(obj): return f"{obj.__module__}.{obj.__name__}" # 处理函数/方法对象 if inspect.isfunction(obj) or inspect.ismethod(obj): return f"{obj.__module__}.{obj.__qualname__}" # 处理property及类属性 cls = getattr(obj, '__objclass__', None) if cls: for name, member in inspect.getmembers(cls): if member is obj: return f"{cls.__module__}.{cls.__name__}.{name}" # 兜底提示 raise ValueError(f"无法获取对象 {obj} 的完全限定名") def hlp(obj): try: qname = get_qualified_name(obj) # 生成对应帮助链接(可根据后端规则调整) help_path = qname.replace('.', '/') help_url = f"https://ooolib.help.example.com/src/{help_path}" # 为属性/方法添加锚点 if len(qname.split('.')) > 2: help_url += f"#{qname.split('.')[-1]}" print(f"Launching help for \"{qname}\" at \"{help_url}\"") except ValueError as e: print(e)
注意事项
- 对于运行时动态添加的对象(如实例属性、动态生成的方法),可能无法提取到有效的完全限定名,这类场景可根据需求添加过滤逻辑或提示。
inspect模块覆盖了绝大多数内省场景,若遇到特殊对象类型,可进一步扩展该模块的API调用逻辑。
内容的提问来源于stack exchange,提问作者Amour Spirit
相关产品推荐
相关产品推荐

