json.dumps()适用于Python2.7,但不适用于Python3
我有以下代码:json.dumps()适用于Python2.7,但不适用于Python3,python,json,python-2.7,python-3.x,pickle,Python,Json,Python 2.7,Python 3.x,Pickle,我有以下代码: import json src_vol1 = {'provider_id':'src1'} src_vol2 = {'provider_id':'src2'} get_snapshot_params = lambda src_volume, trg_volume: { 'volumeId': src_volume['provider_id'], 'snapshotName': trg_volume['id']} trg_vol1 = {'id':'trg1'}
import json
src_vol1 = {'provider_id':'src1'}
src_vol2 = {'provider_id':'src2'}
get_snapshot_params = lambda src_volume, trg_volume: {
'volumeId': src_volume['provider_id'],
'snapshotName': trg_volume['id']}
trg_vol1 = {'id':'trg1'}
trg_vol2 = {'id':'trg2'}
src_vols = [src_vol1, src_vol2]
trg_vols = [trg_vol1, trg_vol2]
snapshotDefs = map(get_snapshot_params , src_vols, trg_vols)
params = {'snapshotDefs': snapshotDefs}
json.dumps(params)
我需要它在Python3和Python2.7上工作,但是在Python3上我得到了
Traceback (most recent call last):
File "./prog.py", line 16, in <module>
File "/usr/lib/python3.4/json/__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python3.4/json/encoder.py", line 192, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.4/json/encoder.py", line 250, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python3.4/json/encoder.py", line 173, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <map object at 0xb72a1a0c> is not JSON serializable
回溯(最近一次呼叫最后一次):
文件“/prog.py”,第16行,在
文件“/usr/lib/python3.4/json/_init__.py”,第230行,转储
返回默认编码器编码(obj)
文件“/usr/lib/python3.4/json/encoder.py”,第192行,在encode中
chunks=self.iterencode(o,\u one\u shot=True)
iterencode中的文件“/usr/lib/python3.4/json/encoder.py”,第250行
返回_iterencode(o,0)
默认情况下,文件“/usr/lib/python3.4/json/encoder.py”第173行
raise TypeError(repr(o)+“不可JSON序列化”)
TypeError:不可序列化JSON
我试着用dict()绕过参数,但没用。
有什么区别?我在文档中没有找到任何东西 在蟒蛇2和3之间
要复制python2行为,请将map(…)
替换为list(map(…)
这在python2中仍然有效,但在python2中,它为map
返回的列表创建了一个无意义的额外副本,这会消耗更多内存并运行得更慢
要避免这种情况,您可以尝试以下方法:
try:
from itertools import imap as map # py2
except ImportError:
pass # py3, map is already defined apropriately
或者您也可以检查系统版本,然后根据系统版本将
map
重新定义为map
:
import sys
ver = sys.version[:3]
if ver < '3': #Python 2
map_ = map #use same map method
elif ver >= '3': #Python 3
map_ = lambda f,x : list(map(f,x))
snapshotDefs = map_(get_snapshot_params , src_vols, trg_vols)
导入系统
版本=系统版本[:3]
如果版本<'3':#Python 2
映射=映射#使用相同的映射方法
elif ver>='3':#Python 3
map=λf,x:list(map(f,x))
snapshotDefs=map(获取快照参数、src卷、trg卷)
是的,尽管附加的
列表()
将无用。