2008-12-03 19 views
33

Czy Python ma możliwość tworzenia dynamicznych słów kluczowych?Dynamiczne argumenty słów kluczowych w Pythonie?

Na przykład:

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

Chcę być w stanie zmienić USD część na podstawie wybranej walucie.

+1

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

Odpowiedz

40

Tak, robi. Użyj **kwargs w definicji funkcji.

Przykład:

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


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

Ale dlaczego trzeba to?

+2

Dzięki, to się udało. Potrzebowałem tego, ponieważ nie mam dostępu do samej funkcji (jest to funkcja Django). Tak więc sama metoda szuka już kwargs, ale muszę dynamicznie utworzyć słowo kluczowe dla metody do analizy. – user42876

0

Tak, rodzaj. W swojej metodzie filtra możesz zadeklarować zmienną typu wildcard, która zbiera wszystkie nieznane keyword arguments. Metoda może wyglądać następująco:

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

Dzięki, ale niestety nie mam dostępu do samej funkcji (jest to funkcja Django). Tak więc sama metoda szuka już kwargs, ale muszę dynamicznie utworzyć słowo kluczowe dla metody do analizy. – user42876

10

Można łatwo to zrobić deklarując swoją funkcję tak:

def filter(**kwargs): 

czynność zostanie teraz przekazany do słownika nazwie kwargs zawierający słowa kluczowe i wartości przekazywane do twojej funkcji. Zauważ, że syntaktycznie słowo kwargs jest bez znaczenia; ** jest przyczyną dynamicznego zachowania słów kluczowych.

Można również wykonać odwrotność. Jeśli wywołanie funkcji i masz słownika, który odpowiada na argumenty, można zrobić

someFunction(**theDictionary) 

Istnieje również mniejsze wykorzystywane foo * wariant, który powoduje, że można otrzymać tablicę argumentów. Jest to podobne do zwykłych tablic C vararg.

21

Jeśli rozumiem o co pytasz poprawnie,

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

robi to, co trzeba.

+1

dokładnie to, czego potrzebowałem! dzięki. –

Powiązane problemy