0

所以,我想修改 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 的其他调用,假设标准顺序。

4

1 回答 1

0

看到您的更改破坏了预期的签名json.loads并且您担心它会破坏依赖于原始签名的其他代码,我同意 Simeon Visser 的观点,似乎您根本不​​应该这样做。

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

于 2013-11-12T18:20:40.637 回答