2008-12-03 68 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