python - 动态添加关键参数到方法

标签 python dynamic methods named-parameters

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

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/

相关文章:

java - Servlet 3.1 - 部件 - 方法 getParts() 未解决

python - 使用 (Py)GTK 在调整大小时自动缩放图像

file - 无法在 mule 中创建动态文件入站端点

python - 用于通讯python的UNIX套接字-C++

linq - LinQ 中的动态列名

php - 使用 Javascript 和 php 添加动态文本字段

java - 如何创建一个 get 方法来返回一个字符串和一个整数?

java - 如何使用两种方法打印出星号?

python - 在 pandas 中混合聚合和分组

python - 使用 TLB 定义的接口(interface)与 Python 和 COM