2008-12-03 15 views
33

क्या पाइथन में गतिशील कीवर्ड बनाने की क्षमता है?पायथन में गतिशील कीवर्ड तर्क?

उदाहरण के लिए:

qset.filter(min_price__usd__range=(min_price, max_price)) 

मैं एक चयनित मुद्रा के आधार पर usd भाग को बदलने में सक्षम होना चाहता हूँ।

+1

देखें http://stackoverflow.com/questions/310732/in-django-how-does-one-filter-a-queryset-with-dynamic-field-lookups –

उत्तर

40

हाँ, यह करता है। फ़ंक्शन परिभाषा में **kwargs का उपयोग करें।

उदाहरण:

def f(**kwargs): 
    print kwargs.keys() 


f(a=2, b="b")  # -> ['a', 'b'] 
f(**{'d'+'e': 1}) # -> ['de'] 

लेकिन तुम यही कारण है कि क्या ज़रूरत है?

+2

धन्यवाद, ऐसा हुआ। मुझे इसकी आवश्यकता है क्योंकि मेरे पास फ़ंक्शन तक पहुंच नहीं है (यह एक Django फ़ंक्शन है)। तो विधि स्वयं ही ** kwargs की तलाश कर रही है, लेकिन मुझे पार्स करने के लिए विधि को गतिशील रूप से कीवर्ड बनाने की आवश्यकता है। – user42876

0

हां, तरह। अपनी फ़िल्टर विधि में आप एक वाइल्डकार्ड वेरिएबल घोषित कर सकते हैं जो सभी अज्ञात keyword arguments एकत्र करता है। इस तरह अपने कार्य की घोषणा के द्वारा

def filter(self, **kwargs): 
    for key,value in kwargs: 
     if key.startswith('min_price__') and key.endswith('__range'): 
      currency = key.replace('min_price__', '').replace('__range','') 
      rate = self.current_conversion_rates[currency] 
      self.setCurrencyRange(value[0]*rate, value[1]*rate) 
+0

धन्यवाद, लेकिन दुर्भाग्य से मेरे पास फ़ंक्शन तक पहुंच नहीं है (यह एक Django फ़ंक्शन है)। तो विधि स्वयं ही ** kwargs की तलाश कर रही है, लेकिन मुझे पार्स करने के लिए विधि को गतिशील रूप से कीवर्ड बनाने की आवश्यकता है। – user42876

10

आप आसानी से ऐसा कर सकते हैं:: अपने विधि इस प्रकार दिखाई देंगे

def filter(**kwargs): 

अपने कार्य अब एक शब्दकोश kwargs कहा जाता है कि खोजशब्दों और मूल्यों से पारित कर दिया शामिल पारित हो जाएगा आपके काम के लिए। ध्यान दें कि, वाक्य रचनात्मक रूप से, kwargs शब्द व्यर्थ है; ** गतिशील कीवर्ड व्यवहार का कारण बनता है।

आप रिवर्स भी कर सकते हैं। आप एक समारोह बुला रहे हैं, और आप एक शब्दकोश है कि तर्क से मेल खाती है है, तो आप

someFunction(**theDictionary) 

वहाँ भी कम इस्तेमाल किया * foo संस्करण है, जो आप तर्क की एक सरणी प्राप्त करने के लिए कारण बनता है कर सकते हैं। यह सामान्य सी vararg सरणी के समान है।

21

तो मैं समझता हूँ कि क्या आप सही तरीके से पूछ रहे हैं,

qset.filter(**{ 
    'min_price_' + selected_currency + '_range' : 
    (min_price, max_price)}) 

आपको क्या चाहिए होता है।

+1

बिल्कुल मुझे क्या चाहिए! धन्यवाद। –

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