我想动态设置实例方法的默认键参数。例如,

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}

我用了type.CodeType(我不太了解)的东西作为一个函数(不是方法),并使其正常工作(很好,没有失败),但是添加的键参数没有显示在卡格中函数的字典(仅打印{})

更改仅需针对当前实例进行。实际上,我现在正在使用一个类(在我的脑海中是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

最佳答案

您可能正在寻找这样的东西:

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/

10-11 05:05