Python中的动态关键字参数?

时间:2008-12-03 16:12:22

标签: python

python是否有能力创建动态关键字?

例如:

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

我希望能够根据所选货币更改 usd 部分。

4 个答案:

答案 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)