Python.NET(clr)如何获取.NET方法的函数签名?
在Python中获取.NET方法的签名
由于通过clr导入的.NET方法并非Python原生可调用对象,Python标准库的inspect.signature无法识别这类对象,需要借助.NET自身的反射机制来获取方法签名,以下是两种可行方案:
方案一:使用.NET反射API(推荐)
直接调用.NET的反射接口获取方法的参数信息,这是最可靠的方式:
import clr clr.AddReference(r"C:\foo.dll") from foo import * my_foo = Foo() # 获取方法的.NET MethodInfo对象 method_info = my_foo.my_method.Method # 获取所有参数定义 parameters = method_info.GetParameters() # 构建签名字符串 signature = [] for param in parameters: # 获取参数类型的名称和参数名 type_name = param.ParameterType.Name param_name = param.Name # 如果是可选参数,标注默认值 if param.HasDefaultValue: signature.append(f"{type_name} {param_name} = {param.DefaultValue}") else: signature.append(f"{type_name} {param_name}") # 输出完整签名 print(f"{method_info.Name}({', '.join(signature)})")
方案二:解析方法的__doc__属性
部分.NET方法的__doc__属性会包含签名信息,可以通过解析该字符串提取签名(此方法依赖文档生成情况,可靠性略低):
import clr clr.AddReference(r"C:\foo.dll") from foo import * my_foo = Foo() # 从__doc__中提取签名部分(通常在文档开头) doc = my_foo.my_method.__doc__ if doc: # 截取到第一个换行符之前的内容,通常就是签名 signature = doc.split('\n')[0].strip() print(signature)
补充说明
- 如果是静态方法,直接通过类获取方法对象即可:
method_info = Foo.static_method.Method - 若需要更详细的类型信息(如完整命名空间的类型名),可以将
param.ParameterType.Name替换为param.ParameterType.FullName
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

