2012-01-30 56 views
10

我想將Webob MultiDict的POST轉換爲嵌套字典。例如。如何將MultiDict轉換爲嵌套字典

從一個POST

所以:

'name=Kyle&phone.number=1234&phone.type=home&phone.number=5678&phone.type=work' 

到multidict;

[('name', 'Kyle'), ('phone.number', '1234'), ('phone.type', 'home'), ('phone.number', '5678'), ('phone.type', 'work')] 

到嵌套字典

{'name': 'Kyle', 
'phone': [ 
    { 
    'number': '12345', 
    'type': 'home', 
    },{ 
    'number': '5678', 
    'type': 'work', 
    }, 

任何想法?

編輯

我結束了提取從formencodevariable_decode方法張貼意志。 唯一需要做的更改是使列表明確,例如,

'name=Kyle&phone-1.number=1234&phone-1.type=home&phone-2.number=5678&phone-2.type=work' 

哪個更好,原因很多。

+0

同樣來自看一看胡椒Pylons項目:http://docs.pylonsproject.org/projects/peppercorn/en/latest/它需要在構建表單時更加明確,但確實允許任意嵌套。 – 2015-12-29 23:07:56

回答

10

如果您formencode安裝或者可以安裝它,簽出他們variabledecode module

+0

我提取了variable_decode()方法,它的工作原理非常完美,謝謝。 – 2012-01-30 15:46:09

1

我還沒有測試它的時候,它是相當嚴格的,但我希望這將工作(我只張貼,因爲它是已經有一段時間,因爲你張貼的問題):

>>> def toList(s): 
...  answer = [] 
...  L = s.split("&") 
...  for i in L: 
...    answer.append(tuple(i.split('='))) 
...  return answer 

>>> def toDict(L): 
...  answer = {} 
...  answer[L[0][0]] = L[0][1] 
...  for i in L[1:]: 
...    pk,sk = L[i][0].split('.') 
...    if pk not in answer: 
...      answer[pk] = [] 
...    if sk not in answer[pk][-1]: 
...      answer[pk][sk] = L[i][1] 
...    else: 
...      answer[pk].append({sk:L[i][1]}) 

如果不是100%,但至少應該讓你在一個良好的開端。

希望這有助於

+0

謝謝你的迴應,它讓我更好地理解了我通過不明確列表創建的限制。很難知道何時創建一個列表,除非它在密鑰名稱中指明。 – 2012-01-30 15:56:58

1

我更喜歡明確的方式來解決問題:

  1. 除以屬於相同的結構(或字典)與相同的字段名稱相同的組成員,像

    'name=Kyle&phone1=1234&phone1=home&phone2=5678&phone2=work' 
    
  2. 在表格中的字段的順序有保證,所以multidict將是: (( '姓名', '凱爾'),( 'PHONE1',「123 4' , '家'),( 'PHONE2', '5678', '工作'))

  3. 然後代碼將是這樣的:

    def extract(key, values): 
        extractor = { 
         "name":str, 
         "phone":lambda *args:dict(zip(('number', 'type'), args) 
        } 
        trimed_key = re.match(r"^(\w+)", key).group(1) 
        return trimed_key, extractor(trimed_key, *values) 
    
    nested_dict = {} 
    for i in multidict(): 
        key, values = i[0], i[1:] 
        nested_dict.setdefault(key, []) 
        trimed_key, data_wanted = extract(key, values) 
        nested_dict[trimed_key].append(data_wanted) 
    
    for key in nested_dict: 
        if len(nested_dict[key]) == 1: 
         nested_dict[key] = nested_dict[key][0] 
    
+0

謝謝你的迴應。顯式是解決這個問題的方法。我結束使用Will發佈的formencode包中的variable_decode()方法。 – 2012-01-30 16:02:51

相關問題