2009-06-21 27 views
29

Trong python 2.6, đoạn mã sau:Làm thế nào để ngăn chặn Python parse_qs từ phân tích các giá trị đơn vào danh sách?

import urlparse 
qsdata = "test=test&test2=test2&test2=test3" 
qs = urlparse.parse_qs(qsdata) 
print qs 

Cung cấp đầu ra sau đây:

{'test': ['test'], 'test2': ['test2', 'test3']} 

Điều đó có nghĩa rằng mặc dù chỉ có một giá trị cho kiểm tra, nó vẫn đang được phân tích thành một danh sách . Có cách nào để đảm bảo rằng nếu chỉ có một giá trị, nó không được phân tích cú pháp thành một danh sách, sao cho kết quả sẽ trông như thế này?

{'test': 'test', 'test2': ['test2', 'test3']} 
+10

không phải là nó nhất quán hơn rằng tất cả các giá trị là danh sách và bạn không phải lo lắng nếu nó là một danh sách hoặc một giá trị duy nhất, tại sao bạn sẽ muốn khác? –

+3

Chuẩn HTTP có nghĩa là nó phải là một danh sách. Có vẻ như không có nhiều lựa chọn thay thế. –

Trả lời

24

Bạn có thể sửa chữa nó sau đó ...

import urlparse 
qsdata = "test=test&test2=test2&test2=test3" 
qs = dict((k, v if len(v)>1 else v[0]) 
      for k, v in urlparse.parse_qs(qsdata).iteritems()) 
print qs 

Tuy nhiên, tôi không nghĩ rằng tôi muốn điều này. Nếu một tham số bình thường là một danh sách xảy ra để đến với chỉ có một bộ mục, sau đó tôi sẽ có một chuỗi thay vì danh sách các chuỗi tôi thường nhận được.

99

Một sidenote cho ai đó chỉ muốn một từ điển đơn giản và không bao giờ cần nhiều giá trị với cùng một phím, hãy thử:

dict(urlparse.parse_qsl('foo=bar&baz=qux')) 

này sẽ cung cấp cho bạn một ID tốt {'foo': 'bar', 'baz': 'qux'}. Xin lưu ý rằng nếu có nhiều giá trị cho cùng một khóa, bạn sẽ chỉ nhận được giá trị cuối cùng.

+0

Không 'parse_qsl()' cung cấp cho bạn một danh sách các cặp khóa-giá trị (và không phải là một dict)? –

+11

@MisterBhoot Vâng, đó là lý do tại sao tôi có cuộc gọi 'dict (...)' xung quanh nó. :) – tuomassalo

+0

Rất tiếc, tôi rất tiếc. Tôi nên bắt đầu ngủ sớm. –

Các vấn đề liên quan