关键词:python, setattr
1. python中的例子
_ffi_api.py
import sys
thismodule = sys.modules[__name__]
def addfunc():
a = 1
b = 2
c = a + b
print("c value is:", c)
def subfunc(a, b):
c = a - b
print("a - b is:", c)
setattr(thismodule, "add", addfunc)
setattr(thismodule, "sub", subfunc)
test.py
import _ffi_api
print("test setattr")
_ffi_api.add()
_ffi_api.sub(20, 5)
输出
test setattr
c value is: 3
a - b is: 15
2. tvm中的例子
tvm中需要为一些python模块绑定C中的函数,于是采用了类似上面的方式。
tvm._ffi._init_api("ir", __name__)
def _init_api_prefix(module_name, prefix):
module = sys.modules[module_name]
for name in list_global_func_names():
if not name.startswith(prefix):
continue
fname = name[len(prefix) + 1 :]
target_module = module # python中的module
if fname.find(".") != -1:
continue
f = get_global_func(name) # 根据 name 得到 c 中的函数
ff = _get_api(f) # 设置 is_global 属性为 true
ff.__name__ = fname
ff.__doc__ = "TVM PackedFunc %s. " % fname
setattr(target_module, ff.__name__, ff)