Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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
json.dumps()适用于Python2.7,但不适用于Python3_Python_Json_Python 2.7_Python 3.x_Pickle - Fatal编程技术网

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卷)
是的,尽管附加的
列表()
将无用。