2011-10-07 25 views
5

मैं जेएसओएन लाइब्रेरी का उपयोग कर जेएसओएन अनुरोधों को पार्स कर रहा हूं जो पायथन शब्दकोश में पार्स करता है। चूंकि अनुरोध उपयोगकर्ता द्वारा जेनरेट किए गए हैं, इसलिए मुझे उन पैरामीटर के लिए डिफ़ॉल्ट मानों को ठीक करने की आवश्यकता है जिन्हें आपूर्ति नहीं की गई है। अन्य भाषाओं में टर्नरी ऑपरेटरों की तरह सामान होते हैं जो दोहराव वाले अनुप्रयोगों के लिए समझ में आता है। लेकिन नीचे दिए गए कोड प्रति पैरामीटर 4 लाइनों की आवश्यकता है।पाइथनिक रूप से शब्दकोश से डिफ़ॉल्ट मान कैसे ठीक करें?

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 

वहाँ एक pythonic कोड की लाइनों को कम करने या इसे और अधिक पठनीय बनाने के लिए रास्ता नहीं है?


संपादित: दोनों (ऊपर) जवाब समान रूप से उपयोगी होते हैं। मैं विभिन्न परिस्थितियों में दोनों का उपयोग किया

+0

के बाद से और कोई नहीं अभी तक बाहर इस ओर इशारा किया गया है, लाइन: यदि "पंक्तियाँ" request.keys() में **: ** है यह भी कि आप घमंडी कोड करता है isinstance(result, dict) से निपटने के लिए की जरूरत है में मदद करता है सरल के बराबर: ** यदि अनुरोध में "पंक्तियां": **। – MrWonderful

उत्तर

15

चूक की एक प्रति पर dict.update विधि का उपयोग करें:

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

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

यह आपको एक वर्ग विशेषता या मॉड्यूल वैश्विक चर, जो आप शायद क्या करना चाहते हैं के रूप में defaults रखने के लिए अनुमति देता है।

तुम भी में अंतिम दो पंक्तियों को जोड़ सकते हैं: एक और समाधान के लिए

result = dict(defaults, **request) 

, Kevin's answer देखते हैं।

+0

मुझे यह dict.get() के विकल्प के रूप में पसंद है, क्योंकि यह आपको एक पंक्ति पर अपने सभी डिफ़ॉल्ट मान निर्दिष्ट करने की अनुमति देता है। यह उपयोगी हो सकता है यदि भविष्य में आपके डिफ़ॉल्ट परिवर्तन होने की संभावना है - तो आपको बहुत से 'if' कथनों के माध्यम से शिकार करने की आवश्यकता नहीं है, जहां उन्हें घोषित किया जाता है। – Kevin

+0

+1 - आपके डिफ़ॉल्ट और अत्यधिक रखरखाव के प्रबंधन के लिए एक केंद्रीय स्थान प्रदान करता है। अच्छा उत्तर! –

+2

+1। यह एक उत्कृष्ट समाधान है। मुझे इस बात पर जोर देना चाहिए कि इस विधि के साथ 'डिफ़ॉल्ट' की एक प्रति के साथ उपयोग किया जाना चाहिए, अन्यथा 'डिफ़ॉल्ट' संशोधित हो। इसके अलावा, तर्क फिसल नहीं जा सकता है। 'Request.update (डिफ़ॉल्ट) 'करना डिफ़ॉल्ट मानों के साथ अनुरोध को ओवरराइट करेगा। –

12

आप शब्दकोश विधि get का उपयोग कर सकते हैं, जिसका दूसरा तर्क शब्दकोश में कोई मूल्य मौजूद नहीं है, तो वापस लौटने का डिफ़ॉल्ट मान है। अजगर

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

+1 यह विधि समझने योग्य और समझने में आसान है। मैं इसे पसंद करता हूं जब डिफ़ॉल्ट के साथ बहुत अधिक मूल्य नहीं होते हैं। –

+1

इच्छा है कि मैं दो उत्तरों को स्वीकार कर सकता हूं :-( – aitchnyu

2

शब्दकोशों एक get() समारोह है कि एक डिफ़ॉल्ट पैरामीटर लेता है (आप देख सकते हैं कि here)। तो आप कुछ ऐसा कर सकते हैं:

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

और इसी तरह।

संपादित करें: आप शायद ऊपर पेट्र से update समाधान के साथ जाना चाहते हैं।

2

आप भाग्यशाली अजगर 3.3+ उपयोग करने के लिए हैं, तो आप 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 

दोनों defaults और request dicts ChainMap करने के लिए "जुड़ा हुआ" कर रहे हैं, नहीं की नकल की। उन्हें कोई भी परिवर्तन result में परिलक्षित होगा:

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

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

इसे रोकने के लिए, आप जब आप इसे का निर्माण कार्य पूरा कर लें dict करने के लिए एक ChainMap परिवर्तित कर सकते हैं।

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

नाइस। Http://code.activestate.com/recipes/305268/ पर भी चेनमैप का एक उपयोग करने योग्य 2.x कार्यान्वयन (थोड़ा अलग वर्तनी) है (लिंक में है 3.x दस्तावेज़ लेकिन मैंने सोचा कि इसे यहां भी जाना चाहिए) – torek

+0

@torek True। हालांकि, इस विशेष मामले में परेशानी के लायक नहीं है। –

संबंधित मुद्दे