2008-12-03 69 views
33

python是否有能力创建动态关键字?Python中的动态关键字参数?

例如:

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

我希望能够根据选定的货币来改变美元一部分。

+1

请参阅http://stackoverflow.com/questions/310732/in-django-how-does-one-filter-a-queryset-with-dynamic-field-lookups – 2008-12-03 17:56:14

回答

40

是的,它的确如此。在函数定义中使用**kwargs

例子:

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


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

但是,为什么你需要吗?

+2

谢谢,它做到了。 我需要这个,因为我没有访问函数本身(这是一个Django函数)。所以这个方法本身已经在寻找** kwargs,但是我需要为解析的方法动态地创建关键字。 – user42876 2008-12-03 16:36:55

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) 
+0

谢谢,但不幸的是我没有访问函数本身(这是一个Django函数)。所以这个方法本身已经在寻找** kwargs,但是我需要为解析的方法动态地创建关键字。 – user42876 2008-12-03 16:28:19

10

您可以轻松地做到这一点通过声明你这样的功能:

def filter(**kwargs): 

的功能现在将通过一个名为kwargs字典包含通过关键字和值到你的功能。请注意,在句法上,单词kwargs是没有意义的; **是导致动态关键字行为的原因。

你也可以做相反的事情。如果你调用一个函数,你必须对应于参数的字典,你可以做

someFunction(**theDictionary) 

还有一个较少使用的* foo的变种,这导致您收到的参数数组。这与正常的C可变参数阵列相似。

21

如果我理解你的要求正确,

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

做你所需要的。

+1

正是我需要的!谢谢。 – 2016-05-07 19:29:39