2016-01-20 49 views
2

我有以下代碼:json.dumps()適用於Python 2.7版,但不是在蟒蛇3

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()放在PARAMS中,但它沒有工作。 有什麼區別?我沒有在文檔中找到任何內容。

回答

4

map behaves differently 3.

python2之間要重現python2行爲,與list(map(...))更換map(...)

這仍然適用於python2,但是在python2中,它使map返回的列表中的無意義額外副本可以消耗更多內存並且運行速度較慢。

爲了避免它,你可以嘗試這樣的:

try: 
    from itertools import imap as map # py2 
except ImportError: 
    pass # py3, map is already defined apropriately 
+0

謝謝,它仍然可以在Python2上工作嗎? – slashms

+0

是的,儘管額外的list()將是無用的。 – LeartS

+0

@matansab,是的。查看我的更新。 – shx2

0

或者你也可以檢查系統版本,然後根據系統版本重新定義mapmap_

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)