ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-06-25 09:46:17  阅读:253  来源: 互联网

标签:python methods dynamic 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中显示函数字典(只打印{})

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有