python是否有能力创建动态关键字?
例如:
qset.filter(min_price__usd__range=(min_price, max_price))
我希望能够根据所选货币更改 usd 部分。
答案 0 :(得分:46)
是的,确实如此。在函数定义中使用**kwargs
。
示例:
def f(**kwargs):
print kwargs.keys()
f(a=2, b="b") # -> ['a', 'b']
f(**{'d'+'e': 1}) # -> ['de']
但你为什么需要呢?
答案 1 :(得分:26)
如果我理解你正确的要求,
qset.filter(**{
'min_price_' + selected_currency + '_range' :
(min_price, max_price)})
做你需要的。
答案 2 :(得分:13)
您可以通过声明您的功能轻松完成此操作:
def filter(**kwargs):
现在,您的函数将传递一个名为kwargs的字典,其中包含传递给您的函数的关键字和值。请注意,从语法上讲,单词kwargs
毫无意义; **
是导致动态关键字行为的原因。
你也可以反过来。如果您正在调用函数,并且您有一个与参数对应的字典,则可以执行
someFunction(**theDictionary)
还有较少使用的* foo变体,它会导致您接收一组参数。这类似于普通的C vararg数组。
答案 3 :(得分: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)