如何使用装饰器向现有python函数添加必需参数?

时间:2013-11-12 17:29:55

标签: python decorator

所以,我想修改json.loads()函数来接受一个新的关键字参数,但不要让它只是kwargs的一部分。 换句话说,我希望它是函数签名的明确部分。

这是我对如何做到这一点的猜测。 有更好的方法吗?

def json_to_python_syntax(json_method):
    """
    Translate JSON-conforming key names to Pythonic standards on dict.

    The goal of this decorator is to add a standard keyword parameter
    'convert_syntax' onto the method.  But, I'm not sure how to do this.

    """
    @wraps(json_method)
    def wrapper(json_string, convert_syntax=False, **kwargs):
        pythonic_dict = dict()
        json_syntax_dict = json_method(json_string, **kwargs)

        if not convert_syntax:
            return json_syntax_dict

        for key, value in json_syntax_dict.iteritems():
            for json_syntax in re.finditer(r'[A-Z]', key):
                key = key.replace(
                    json_syntax.group(), '_' + json_syntax.group()[0].lower())
            pythonic_dict[key] = value
        return pythonic_dict

    return wrapper

我对这个方法的关注是,这个猴子在json.loads中具有预期的关键字参数顺序(它使得convert_syntax成为json字符串之后的第一个预期参数)并且可能搞乱其他对更大的json.loads的调用承担标准订单的程序。

1 个答案:

答案 0 :(得分:0)

看到你的更改打破了json.loads的预期签名并且你关注它打破了依赖于原始签名的其他代码,我同意Simeon Visser,看起来你不应该这样做一点都不。

只有你编写的代码才能正确调用你的新方法,那么为什么不给你的方法一个不同的名字,而不是装饰一个现有的方法呢?如果要阻止其他代码在没有convert_syntax标志的情况下调用此方法,请完全避免导入json模块,而是导入包装json模块的json库。 / p>