Есть ли у python возможность создавать динамические ключевые слова?
Например:
qset.filter(min_price__usd__range=(min_price, max_price))
Я хочу иметь возможность изменять часть доллар США в зависимости от выбранной валюты.






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