2011-10-07 30 views
5

Tôi đang phân tích các yêu cầu JSON bằng cách sử dụng thư viện JSON phân tích cú pháp thành từ điển python. Khi các yêu cầu được tạo bởi người dùng, tôi cần sửa các giá trị mặc định cho các tham số chưa được cung cấp. Các ngôn ngữ khác có các công cụ như toán tử bậc ba có ý nghĩa đối với các ứng dụng lặp đi lặp lại. Nhưng đoạn mã dưới đây cần 4 dòng cho mỗi tham số.Cách sửa các giá trị mặc định từ một từ điển bằng Python?

if "search_term" in request.keys(): 
    search_term=request['search_term'] 
else: 
    search_term="" 
if "start" in request.keys(): 
    start=request['start'] 
else: 
    start=0 
if "rows" in request.keys(): 
    rows=request['rows'] 
else: 
    rows=1000000 

Có cách nào để cắt giảm dòng mã hoặc làm cho mã dễ đọc hơn không?


Sửa: Cả (trên cùng) câu trả lời là không kém phần hữu ích. Tôi đã sử dụng cả trong những hoàn cảnh khác nhau

+0

Vì không có ai khác đã chỉ ra điều này được nêu ra, dòng: ** nếu "hàng" trong request.keys(): ** là tương đương với đơn giản hơn: ** nếu "hàng" theo yêu cầu: **. – MrWonderful

Trả lời

15

Sử dụng phương pháp dict.update trên một bản sao của giá trị mặc định:

defaults = dict(a=1, b=2, c=3) 

result = dict(defaults) # Copy the defaults 
result.update(request) # Update with your values 

này cho phép bạn giữ defaults như một thuộc tính lớp hoặc mô-đun biến toàn cầu, mà có thể bạn muốn làm.

Bạn cũng có thể kết hợp hai dòng cuối cùng vào:

result = dict(defaults, **request) 

Đối với một giải pháp khác, xem Kevin's answer.

+0

Tôi thích điều này như là một thay thế cho dict.get(), bởi vì nó cho phép bạn chỉ định tất cả các giá trị mặc định của bạn trên một dòng. Điều này có thể hữu ích nếu các giá trị mặc định của bạn có khả năng thay đổi trong tương lai - sau đó bạn không phải truy tìm nhiều câu lệnh 'if' để tìm nơi chúng được khai báo. – Kevin

+0

+1 - cung cấp một vị trí trung tâm để quản lý các giá trị mặc định của bạn và có thể bảo trì cao. Câu trả lời tốt! –

+2

+1. Đây là một giải pháp tuyệt vời. Tôi phải nhấn mạnh rằng với phương pháp này phải được sử dụng với một bản sao của 'mặc định', nếu không' mặc định' được sửa đổi. Ngoài ra, logic không thể được lật. Làm 'request.update (mặc định)' sẽ ghi đè lên yêu cầu với các giá trị mặc định. –

12

Bạn có thể sử dụng phương thức từ điển get, đối số thứ hai là giá trị mặc định để trả về nếu không có giá trị nào tồn tại trong từ điển.

start = request.get('start', 0) 
+0

+1 Phương pháp này dễ đọc và dễ hiểu. Tôi thích nó khi không có quá nhiều giá trị mặc định. –

+1

muốn tôi có thể chấp nhận hai câu trả lời :-( – aitchnyu

2

điển Python có chức năng get() mà phải mất một tham số mặc định (bạn có thể kiểm tra xem here). Vì vậy, bạn có thể làm điều gì đó như:

params.get('search_term', '') 
params.get('some_other_field', 0) 

v.v.

EDIT :: Bạn có thể muốn đi với giải pháp update từ Petr ở trên.

2

Nếu bạn đủ may mắn để sử dụng Python 3.3+, bạn có thể sử dụng collections.ChainMap:

from collections import ChainMap 

defaults = {'color': 'red', 'taste': 'sweet'} 
request = {'taste': 'sour', 'size': 'small'} 

result = ChainMap(request, defaults) 

print(result['taste']) # sour -- overridden 
print(result['color']) # red -- from default 
print(result['size']) # small -- new value 

Cả defaultsrequest dicts được “gắn” vào ChainMap, không sao chép. Mọi thay đổi đối với họ sẽ được phản ánh trong result:

defaults['color'] = 'green' 
print(result['color']) # green 

del result['taste'] 
print(result['taste']) # sweet 

Để tránh điều này, bạn có thể chuyển đổi một ChainMap để dict khi bạn đã hoàn tất việc xây dựng nó. Điều này cũng giúp nếu bạn cần để đối phó với mã kiêu ngạo mà không isinstance(result, dict):

print(dict(result)) 
# {'color': 'green', 'taste': 'sweet', 'size': 'small'} 
+0

Rất tốt, có thể triển khai 2.x có thể sử dụng ChainMap (được viết hơi khác một chút) tại http://code.activestate.com/recipes/305268/ (liên kết nằm trong 3.x tài liệu nhưng tôi nghĩ rằng nó nên đi ở đây quá.) – torek

+0

@ torek Đúng. Nó có lẽ không đáng bận tâm trong trường hợp cụ thể này, mặc dù. –

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