【发布时间】:2012-10-05 05:26:46
【问题描述】:
在 Python 中进行一些元编程,我必须动态创建一个函数。我的问题是直到生成代码才确定参数的数量。所以不同的生成函数会有不同名称的不同参数。但是当函数生成时,所有信息都可用,我不想使用**args!这是一个例子:
# information collected by my codgen process
arg_names = ['param_a','param_b','param_c']
some_callable = ClassDeterminedWhileGeneratingCode
我想生成的是这样一个函数,它将被添加到一个类中:
def my_fkt(self,param_a,param_b,param_c):
instance = some_callable(param_a=param_a,param_b=param_b,param_c=param_c)
self.do_something(instance)
return instance.generate_result()
我非常习惯于使用高阶函数来生成函数,但如果参数的数量不固定,那将无济于事。我很确定,我在某处看到过使用type.FunctionType 创建函数的代码。但我找不到任何相关文档。
【问题讨论】:
-
这些函数是用于构建完整的类定义,还是只是临时用于类的进一步实例?
-
在构造一个完整的类定义。该函数将在元类的
__new__内生成,并将放入classdict,该classdict将传递给type.__new__。 -
为什么不你想使用
*args和**kw;它们非常适合您在这里的需求。您实际上是在创建一个装饰器,如果您使用*args和**kw来捕获和传递函数参数,则无需生成代码。 -
真正的
my_fkt有点复杂,所以我不确定是否可以在装饰器中实现所有内容。但是不使用*args和**kw的主要目的是,我想要有很好的错误消息。这是一个更大的 codgen 项目的一部分,所以如果可能的话,我想生成函数,就像我手动实现它们一样,只是为了减少调试时的混乱等等。 -
这听起来和
functools.wraps做的很像,不妨看看它的实现。
标签: python code-generation metaprogramming