2008-12-03 12 views
33

¿Pitón tiene la capacidad de crear palabras clave dinámicas?Argumentos de palabras clave dinámicas en Python?

Por ejemplo:

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

Quiero ser capaz de cambiar las USD parte basada en una moneda seleccionada.

+1

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

Respuesta

40

Sí, lo hace. Use **kwargs en una definición de función.

Ejemplo:

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


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

Pero ¿por qué necesita eso?

+2

Gracias, eso fue todo. Lo necesitaba porque no tengo acceso a la función en sí (es una función de Django). Entonces el método en sí ya está buscando ** kwargs, pero necesito crear dinámicamente la palabra clave para el análisis del método. – user42876

0

Sí, más o menos. En su método de filtro puede declarar una variable comodín que recopila todos los keyword arguments desconocidos. Su método podría tener este aspecto:

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

Gracias, pero desafortunadamente no tengo acceso a la función en sí (es una función de Django). Entonces el método en sí ya está buscando ** kwargs, pero necesito crear dinámicamente la palabra clave para el análisis del método. – user42876

10

Usted puede hacer esto al declarar su función como esta:

def filter(**kwargs): 

su función ahora se le pasará un diccionario llamado kwargs que contiene las palabras clave y los valores pasados a tu función. Tenga en cuenta que, sintácticamente, la palabra kwargs no tiene sentido; el ** es lo que causa el comportamiento dinámico de palabras clave.

También puede hacer lo contrario. Si se llama a una función, y que tiene un diccionario que corresponde a los argumentos, se puede hacer

someFunction(**theDictionary) 

También existe la variante * foo menos utilizadas, lo que hace que se recibe una serie de argumentos. Esto es similar a las matrices vararg C normales.

21

Si entiendo lo que preguntas correctamente,

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

hace lo que necesita.

+1

exactamente lo que necesitaba! Gracias. –

Cuestiones relacionadas