【问题标题】:Python code generation: Create functions with varying but known number of parameters of the flyPython 代码生成:创建具有可变但已知数量的参数的函数
【发布时间】: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


【解决方案1】:

看看,

http://snipplr.com/view/17819/

如果你想操纵参数名称,你应该用给定名称的元组替换“y.func_code.co_varnames”。

干杯,乌韦

【讨论】:

    【解决方案2】:

    试试 convtools 库,它支持 input_args 和很多其他东西,都是关于生成临时代码的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 2016-09-05
      • 2012-11-23
      • 2022-06-15
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多