如何在Python中获取MXNet函数的装饰器?
获取MXNet函数装饰器的解决方案
首先,你遇到的问题根源在于:MXNet的多数ndarray API并非纯Python函数,而是通过Cython/ctypes绑定的底层C++实现对象,这类对象不会直接暴露Python装饰器信息。另外你的代码里有个小错误——func_name_list未定义,应该替换为len(apit_split) > 1。
以下是可行的解决方法:
1. 尝试获取包装后的原始Python函数
部分MXNet绑定对象会通过__wrapped__属性指向Python层的包装函数,你可以通过这个属性找到带装饰器的原始函数:
from mxnet import ndarray import inspect APIname = "ndarray.ones" apit_split = APIname.split('.') func_name = apit_split[-1] module_obj = ndarray # 修复条件判断的变量错误 if len(apit_split) > 1: for module_name in apit_split[:-1]: module_obj = getattr(module_obj, module_name) myfunction = getattr(module_obj, func_name) # 检查是否存在包装的原始函数 if hasattr(myfunction, '__wrapped__'): wrapped_func = myfunction.__wrapped__ print("原始Python包装函数:", wrapped_func) # 查看函数的装饰器相关属性 decorator_attrs = [attr for attr in dir(wrapped_func) if 'decorator' in attr or attr == '__wrapped__'] print("装饰器相关属性:", decorator_attrs) # 尝试打印函数源码(能直接看到装饰器) try: print("\n函数源码(含装饰器):\n", inspect.getsource(wrapped_func)) except TypeError: print("无法获取源码,需手动查看模块文件")
2. 直接查看MXNet的Python源码文件
如果上述方法无法获取,你可以找到MXNet对应的模块文件,直接查看源码中的装饰器:
- 先打印模块路径:
print("模块文件路径:", inspect.getmodule(myfunction).__file__) - 打开该文件(通常是
mxnet/ndarray/ndarray.py),搜索def ones(,就能看到函数上方的装饰器,比如@_internal._with_disable_ctx、@_internal._set_default_ctx等。
3. 区分MXNet的API类型
MXNet的API分为两类:
- 纯Python实现的工具函数:这类函数可以直接用你TensorFlow的方法获取装饰器
- 绑定到C++的核心算子:这类需要通过上述方法找到Python包装层才能看到装饰器
内容的提问来源于stack exchange,提问作者Nima shiri
相关产品推荐
相关产品推荐

