关于元编程:向Python模块动态添加函数

dynamically adding functions to a Python module

我们的框架需要用一些难看的样板代码包装某些函数:

1
2
3
4
5
def prefix_myname_suffix(obj):
    def actual():
        print 'hello world'
    obj.register(actual)
    return obj

我想这可以用一个装饰器来简化:

1
2
3
@register
def myname():
    print 'hello world'

然而,这是相当棘手的,主要是因为框架在模块级别上寻找函数名的某种模式。

我在装修工身上试过以下方法,但没有用:

1
2
3
4
5
6
7
current_module = __import__(__name__)
new_name = prefix + func.__name__ + suffix
# method A
current_module[new_name] = func
# method B
func.__name__ = new_name
current_module += func

任何帮助都将不胜感激!


要么使用

1
current_module.new_name = func

1
setattr(current_module, new_name, func)


看来解决你的问题的办法是让装饰的功能充当原来的功能。

尝试使用twisted中的函数mergeFunctionMetadata,如下所示:扭曲/python/util.py

它使您的修饰函数充当原始函数,希望使框架能够接受它。