Есть ли у python возможность создавать динамические ключевые слова?
Например:
qset.filter(min_price__usd__range=(min_price, max_price))
Я хочу, чтобы изменить usd часть на основе выбранной валюты.
Есть ли у python возможность создавать динамические ключевые слова?
Например:
qset.filter(min_price__usd__range=(min_price, max_price))
Я хочу, чтобы изменить usd часть на основе выбранной валюты.
Да, это так. Используйте **kwargs
в определении функции.
Пример:
def f(**kwargs):
print kwargs.keys()
f(a=2, b="b") # -> ['a', 'b']
f(**{'d'+'e': 1}) # -> ['de']
Но зачем вам это нужно?
Если я правильно понимаю, что вы спрашиваете,
qset.filter(**{
'min_price_' + selected_currency + '_range' :
(min_price, max_price)})
делает то, что вам нужно.
Вы можете легко сделать это, объявив свою функцию следующим образом:
def filter(**kwargs):
теперь вам будет передан словарь с именем kwargs, который содержит ключевые слова и значения, переданные вашей функции. Обратите внимание, что синтаксически слово kwargs
не имеет смысла; **
является причиной динамического поведения ключевых слов.
Вы также можете сделать обратное. Если вы вызываете функцию, и у вас есть словарь, соответствующий аргументам, вы можете сделать
someFunction(**theDictionary)
Существует также менее используемый вариант * foo, который заставляет вас получать массив аргументов. Это похоже на обычные C vararg массивы.
Да, вроде. В вашем методе фильтрации вы можете объявить переменную подстановки, которая собирает все неизвестные аргументы ключевого слова. Ваш метод может выглядеть так:
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)