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 在json序列化期间计算字典值_Python_Json_Serialization_Dictionary_Lazy Evaluation - Fatal编程技术网

Python 在json序列化期间计算字典值

Python 在json序列化期间计算字典值,python,json,serialization,dictionary,lazy-evaluation,Python,Json,Serialization,Dictionary,Lazy Evaluation,我正在尝试获取一系列序列化字典,其中只有一个特定值发生更改 名为“obj”的虚构python dict “工作”应该是这样的: >>> json.dumps(obj) '{"mcu":{"led0":{"duty": 5}}} >>> json.dumps(obj) '{"mcu":{"led0":{"duty": 6}}} >>> json.dumps(obj) '{"mcu":{"led0":{"duty": 7}}} _placeho

我正在尝试获取一系列序列化字典,其中只有一个特定值发生更改

名为“obj”的虚构python dict

“工作”应该是这样的:

>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 5}}}
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 6}}}
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 7}}}
_placeholder = <some trick to create a placeholder>
obj = {'mcu': {'led0': {'duty': _placeholder}}}
有什么办法可以存档吗

也可以这样做:

>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 5}}}
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 6}}}
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 7}}}
_placeholder = <some trick to create a placeholder>
obj = {'mcu': {'led0': {'duty': _placeholder}}}
\u占位符=
obj={'mcu':{'led0':{'duty':_占位符}}
应该这样“工作”吗

>>> <placeholder modification trick> = 5
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 5}}}
>>> <placeholder modification trick> = 6
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 6}}}
>>> <placeholder modification trick> = 7
>>> json.dumps(obj)
'{"mcu":{"led0":{"duty": 7}}}
>>=5
>>>json.dumps(obj)
{“mcu”:{“led0”:{“职责”:5}}
>>>  = 6
>>>json.dumps(obj)
{“mcu”:{“led0”:{“职责”:6}}
>>>  = 7
>>>json.dumps(obj)
{“mcu”:{“led0”:{“职责”:7}}
运行收益率:

$ python gen.py
{"mcu": {"led0": {"duty": 5}}}
{"mcu": {"led0": {"duty": 6}}}
{"mcu": {"led0": {"duty": 7}}}
{"mcu": {"led0": {"duty": 8}}}
{"mcu": {"led0": {"duty": 9}}}
可以将生成器表达式包装到函数中:

import json

def generate_generator(a, b):
    return ({'mcu': {'led0': {'duty': value}}} for value in range(a, b))

for obj in generate_generator(2, 7):
    print json.dumps(obj)
这里有一个解决方案

导入json

class Gen(object):
    def __init__(self):
        self.x = 1
    def next(self):
        self.x+=1
        return self.x

class Gencoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Gen):
            return obj.next()
        return json.JSONEncoder.default(self, obj)

_gen = Gen()
print json.dumps({'mcu': {'led0': {'duty': _gen}}}, cls=Gencoder)
print json.dumps({'mcu': {'led0': {'duty': _gen}}}, cls=Gencoder)
print json.dumps({'mcu': {'led0': {'duty': _gen}}}, cls=Gencoder)
print json.dumps({'mcu': {'led0': {'duty': _gen}}}, cls=Gencoder)

你可以在CodeBunk上运行代码,事实证明这是最好的答案。尽管我对回答自己的问题感到不舒服

import json
import types

_gen = (value for value in range(5, 10))
property = {'mcu':{'led0':{'duty': _gen}}}

def generator_handler(obj):
    if isinstance(obj, types.GeneratorType):
      return obj.next()
    else:
      return None

print json.dumps(property, default=generator_handler)
print json.dumps(property, default=generator_handler)
print json.dumps(property, default=generator_handler)

它是否必须与barebones
json.dumps一起工作?使用自定义编码器或指定
默认值
函数可以轻松地将生成器替换为其当前值。该死,不能使用此功能,因为我需要能够将_gen传递到函数中,因为_gen将在创建dict之前存在。这将迫使我使用斯皮卡维戈的答案。很抱歉删除了accept。我本来打算将其用作已接受的答案,但找到了一个较短的答案,它实际上使用了生成器。@DanielF我也使用了该答案:)