我想动态设置实例方法的默认键参数。例如,用
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 字典中(它只打印 {})
只能对当前实例进行更改。实际上,我现在正在使用一个类(在我看来我是面向对象的)所以我想用类方法来做,但函数可能更好。像这样的东西:
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
最佳答案
您可能正在寻找这样的东西:
class Module(object):
def __init__(self, **kargs):
old_run = self.run.im_func
def run(self,**kwargs):
kargs_local = kargs.copy()
kargs.update(kwargs)
return old_run(self,**kargs)
self.run = run.__get__(self,Module)
def run(self,**kargs):
print kargs
m1 = Module(foo=3,bar='baz')
m1.run()
print type(m1.run)
m2 = Module(foo=4,qux='bazooka')
m2.run()
print type(m2.run)
我刚刚围绕前面的函数创建了一个包装实例方法。 (部分灵感来自 this post )。
或者:
from functools import partial
from types import MethodType
class Module(object):
def __init__(self, **kargs):
self.run = MethodType(partial(self.run.im_func,**kargs),self,Module)
def run(self,**kargs):
print kargs
但这仍然没有提供您正在寻找的 API...
关于python - 动态添加关键参数到方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16337925/