【问题标题】:json.dumps() works on python 2.7 but not on python 3json.dumps() 适用于 python 2.7 但不适用于 python 3
【发布时间】:2016-04-26 18:59:21
【问题描述】:

我有以下代码:

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

我试图将 dict() 放在参数周围,但没有用。 有什么区别?我在文档中没有找到任何东西。

【问题讨论】:

    标签: python json python-2.7 python-3.x pickle


    【解决方案1】:

    map behaves differently 在 python2 和 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
    

    【讨论】:

    • 是的,虽然额外的list() 将无用。
    【解决方案2】:

    或者您也可以检查系统版本,然后根据系统版本将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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 2017-02-22
      • 1970-01-01
      相关资源
      最近更新 更多