编程语言
首页 > 编程语言> > python – 动态地向方法添加键参数

python – 动态地向方法添加键参数

作者:互联网

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

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

解决方法:

kwargs是一本字典,我们需要做的就是保存它以供日后使用.然后用户可以用它们的值覆盖它.

class Module(object):
    def __init__(self, **kwargs):
        self.defaults = kwargs
    def run(**kwargs):
        values = dict(self.defaults.items() + kwargs.items())
        print values

编辑

您是否正在寻找lambda函数生成?

def wrapfunc(**kwargs):
    def run(kwargs):
        print kwargs
    return lambda x: run(dict(kwargs.items() + x.items()))

run = wrapfunc(ans=42)
run({})
run({'ans':12})

标签:python,methods,dynamic,named-parameters
来源: https://codeday.me/bug/20190625/1284557.html