Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 加载多个回调参数_Python - Fatal编程技术网

Python 加载多个回调参数

Python 加载多个回调参数,python,Python,我有一些从数据库解析的json,我需要做两件事 确保使用(OrderedDict)维护订单,该命令是内置功能,不能修改 检查并重命名作为自定义函数的重复键(重命名\u重复) 在使用json.loads时,如何同时使用这两种方法 json.loads(raw_text_data, object_pairs_hook=OrderedDict,rename_duplicate) 错误 除了您的特定需求之外,还有一个潜在的错误。在Python中,当我们向函数或方法传递参数时,我们不能在关键字参数之后传

我有一些从数据库解析的json,我需要做两件事

  • 确保使用(OrderedDict)维护订单,该命令是内置功能,不能修改
  • 检查并重命名作为自定义函数的重复键(重命名\u重复)
  • 在使用json.loads时,如何同时使用这两种方法

    json.loads(raw_text_data, object_pairs_hook=OrderedDict,rename_duplicate)
    
    错误


    除了您的特定需求之外,还有一个潜在的错误。在Python中,当我们向函数或方法传递参数时,我们不能在关键字参数之后传递
    非关键字参数

    def foo(x, y=None, z=None):
       pass
    
    // we can call foo
    foo(10, 11, 12)
    foo(10, 11, z=12)
    foo(x=10, z=7, y=9)
    
    // But we cannot call foo like this
    foo(x=90, 12, 3)
    // Once we start using a keyword argument, all arguments after that must be a keyword argument, otherwise we will have compile time error.
    

    至于消除重复,我建议处理
    json.loads的结果以消除重复。

    我同意amrx的观点,即
    object\u pairs\u hook=OrderedDict,rename\u duplicate
    不是获得所需内容的正确语法。它看起来像是在告诉函数
    对象对\u hook
    应该返回OrderedDict,它应该调用
    重命名\u duplicate
    。但是你不能给这样一个参数赋予两个值*。我认为没有必要在这里指定OrderedDict,只要这是您从
    重命名\u duplicates
    返回的内容

    import json
    from collections import OrderedDict, Counter
    
    def rename_duplicates(pairs):
        d = OrderedDict()
        c = Counter()
        for k,v in pairs:
            new_k = k + str(c[k])
            d[new_k] = v
            c[k] += 1
        return d
    
    s = '{"foo": "bar", "foo": "qux", "troz": "zort", "foo": "coconuts"}'
    print(json.loads(s, object_pairs_hook=rename_duplicates))
    
    结果:

    OrderedDict([('foo0', 'bar'), ('foo1', 'qux'), ('troz0', 'zort'), ('foo2', 'coconuts')])
    
    OrderedDict([('foo', 'bar'), ('foo1', 'qux'), ('troz', 'zort'), ('foo2', 'coconuts')])
    
    (*从技术上讲,您可以向它传递一个包含两个值的元组,但它仍然会崩溃,因为这个特定参数需要一个可调用的元组,而元组不可调用)


    编辑:从您的问题描述中,我不清楚是否应该重命名唯一键,以及是否应该在第一次遇到非唯一键时重命名它。如果这两个问题的答案都是“否”,那么只需对代码做一点小改动就可以实现

    import json
    from collections import OrderedDict, Counter
    
    def rename_duplicates(pairs):
        d = OrderedDict()
        c = Counter()
        for k,v in pairs:
            if k not in c:
                new_k = k
            else:
                new_k = k + str(c[k])
            d[new_k] = v
            c[k] += 1
        return d
    
    s = '{"foo": "bar", "foo": "qux", "troz": "zort", "foo": "coconuts"}'
    print(json.loads(s, object_pairs_hook=rename_duplicates))
    
    结果:

    OrderedDict([('foo0', 'bar'), ('foo1', 'qux'), ('troz0', 'zort'), ('foo2', 'coconuts')])
    
    OrderedDict([('foo', 'bar'), ('foo1', 'qux'), ('troz', 'zort'), ('foo2', 'coconuts')])
    

    好消息!如果您使用的是Python3的最新版本,那么常规的旧dict的顺序与OrderedDict一样,并且
    json.loads
    应该按照它们出现的顺序返回值。“这就是你的问题解决的一半了!”凯文不幸的是,我们的服务器运行的是python2.7,没有升级诅咒的计划!好吧,我想OrderedDict方法仍然可行…应该只重命名重复的键,但我想您是通过rename_duplicates函数中的OrderedDict()得到的