2013-05-15 6 views
5

मेरे पास निम्न चर हैं जो उपयोगकर्ता वैकल्पिक रूप से किसी फ़ॉर्म के माध्यम से सबमिट कर सकते हैं (वे आवश्यक नहीं हैं, लेकिन खोज को फ़िल्टर करने के लिए ऐसा कर सकते हैं)।पायथन - यदि वेरिएबल मौजूद हैं

color = request.GET.get ('color') 
size = request.GET.get ('size') 

अब मैं इन चरों को एक समारोह में पास करना चाहता हूं, लेकिन केवल अगर वे मौजूद हैं। यदि वे मौजूद नहीं हैं तो मैं बिना तर्क के फ़ंक्शन को चलाने के लिए चाहता हूं।

तर्क के बिना समारोह है:

apicall = search() 

रंग के साथ ही यह

apicall = search (color) 

है और रंग और आकार के साथ यह

apicall = search (color, size) 

है तर्क परिभाषित किया गया है अगर मैं पास करना चाहते हैं यह समारोह में है, लेकिन अगर ऐसा नहीं है तो मैं इसे पास नहीं करना चाहता हूं।

ऐसा करने का सबसे प्रभावी तरीका क्या है? क्या पाइथन के लिए अंतर्निहित तरीकों हैं?

उत्तर

6

मान लीजिए कि यह एक मानक get कॉल (एक शब्दकोश पर) है, यह आसान होना चाहिए। अपने पैरामीटर के लिए डिफ़ॉल्ट के लिए None के साथ अपने फ़ंक्शन को परिभाषित करें, और फिर उन्हें जांचने के लिए परेशान किए बिना color और size पास करें!

def apicall(color=None, size=None): 
    pass # Do stuff 

color = request.GET.get('color') 
size = request.GET.get('size') 
apicall(color, size) 

इस तरह, आप केवल एक ही स्थान पर (समारोह कॉल, तुम वैसे भी जांच करने के लिए समारोह के लिए कई तरीके कहा जा सकता है, जहां के अंदर) में None तर्क के लिए जाँच करें। सबकुछ अच्छा और साफ रहता है। बेशक यह मानता है (जैसे मैंने शीर्ष पर कहा था) कि आपकी get कॉल सामान्य पायथन शब्दकोश की get विधि की तरह है, जो मान नहीं मिला है None

अंत में, मुझे लगता है कि आपका फ़ंक्शन नाम apicall है: एक मौका है कि आपके पास वास्तव में फ़ंक्शन कोड तक पहुंच नहीं है। इस मामले में, चूंकि आप फ़ंक्शन हस्ताक्षर के डिफ़ॉल्ट मानों के बारे में कुछ भी नहीं जानते हैं और None गलत हो सकता है, तो शायद मैं आपके लिए तर्क-जांच करने के लिए बस एक साधारण रैपर लिखूंगा। फिर आप ऊपर के रूप में रैपर कॉल कर सकते हैं!

def wrapped_apicall(color=None, size=None): 
    if color is None and size is None: 
     return apicall() 
    # At least one argument is not None, so... 
    if size is None: 
     # color is not None 
     return apicall(color) 
    if color is None: 
     # size is not None 
     return apicall(size) 
    # Neither argument is None 
    return apicall(color, size) 

नोट: यह दूसरा संस्करण आवश्यक जब तक आप कोड है कि आप कॉल कर रहे हैं और उस पर किसी भी प्रलेखन की जरूरत नहीं है नहीं देख सकते हैं नहीं होना चाहिए! डिफ़ॉल्ट तर्क के रूप में None का उपयोग करना बहुत आम है, इसलिए संभावना है कि आप केवल पहले तरीके का उपयोग कर सकते हैं। मैं केवल रैपर विधि का उपयोग करता हूं यदि आप जिस फ़ंक्शन को कॉल कर रहे हैं उसे संशोधित नहीं कर सकते हैं और आप नहीं जानते कि इसके डिफ़ॉल्ट तर्क क्या हैं (या इसके डिफ़ॉल्ट तर्क मॉड्यूल स्थिरांक या कुछ हैं, लेकिन यह बहुत दुर्लभ है)।

+0

हाँ, पर अगर मैं चर में से एक तो निर्धारित नहीं है 'apicall (रंग, आकार)' एक त्रुटि फेंक देगा, है ना? – user1328021

+0

ठीक है धन्यवाद ... आपने जो लिखा है वह है कि मैं इसे कैसे करने के लिए मानता हूं, लेकिन मैं सोच रहा था कि वहां एक और अधिक प्रभावी तरीका होना चाहिए ... – user1328021

+0

@ user1328021 इन दोनों पंक्तियों को निष्पादित करना मान लें: 'color = request.GET .get ('रंग') 'और ' आकार = request.GET.get ('आकार') ', फिर 'रंग' और 'आकार' दोनों को ** परिभाषित ** की गारंटी है, हालांकि वे 'कोई नहीं' हो सकते हैं '। आपको इस बारे में क्या अक्षम लगता है? –

0

जब आप अपनी विधि को परिभाषित कर रहे हैं, यदि आप डिफ़ॉल्ट तर्क सेट करते हैं तो आप तर्क निर्दिष्ट कर सकते हैं या नहीं।

def search(color=None, size=None): 
    pass 

फिर, जब आप इसे कॉल करते हैं, तो आप कीवर्ड तर्क निर्दिष्ट करते समय निर्दिष्ट कर सकते हैं।इन दोनों मान्य होगा:

apicall = search(color=color) 
apicall = search(size=size) 
0

meybe आप कुछ इस तरह का उपयोग कर सकते हैं:

try: 
    apicall = search (color, size) 
else: 
    apicall = search(color) 
+0

जो काम नहीं करेगा ... आकार कोई नहीं है, लेकिन यह अभी भी मौजूद है ... –

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