【发布时间】:2013-04-26 14:50:25
【问题描述】:
我想动态设置实例方法的默认键参数。例如,与
class Module(object):
def __init__(self, **kargs):
set-default-key-args-of-method(self.run, kargs) # change run arguments
def run(self, **kargs):
print kargs
我们会:
m = Module(ans=42)
m.run.im_func.func_code.co_argcount # => 2
m.run.im_func.func_code.co_varnames # => ('self','ans','kargs')
m.run.im_func.func_defaults # => (42,)
m.run() # print {'ans':42}
我尝试使用 types.CodeType(我不太明白)作为函数(不是方法)并让它工作(好吧不会失败),但是添加的关键参数没有显示在函数的 kargs 字典中(它只打印 {})
只需对当前实例进行更改。实际上,我现在正在使用一个类(我认为我是 OO)所以我想用一个类方法来做,但是一个函数可能更好。比如:
def wrapped_run(**kargs):
def run(**key_args):
print key_args
return wrap-the-run-function(run, kargs)
run = wrapped_run(ans=42)
run.func_code.co_argcount # => 1
run.func_code.co_varnames # => ('ans','key_args') ## keep the 'key_args' or not
run.func_defaults # => (42,)
run() # print {'ans':42}
欢迎任何建议或想法。
关于上下文的一点:
Module 类是某种函数包装器,可用于将低端函数自动包含在数据流系统中,但添加中间过程。我希望模块运行函数(实际上,它可能是 __call___ 函数)具有正确的 API,以便数据流系统能够很好地透明地生成正确的模块输入。
我正在使用 python 2.7
【问题讨论】:
-
值得一问,您是想将函数添加到绑定方法还是未绑定方法(例如,它们应该只影响当前实例还是类的每个实例?)
-
Sooo,您想要一个可以在运行时配置的函数“管道”,以便数据通过?
-
@mgilson,对,它仅适用于当前实例
-
@SpencerRathbun,我为数据流系统 (OpenAlea) 开发模块,我想为我制作的一些特殊类型的函数自动包装
标签: python dynamic methods named-parameters