python是否有能力創建動態關鍵字?Python中的動態關鍵字參數?
例如:
qset.filter(min_price__usd__range=(min_price, max_price))
我希望能夠根據選定的貨幣來改變美元一部分。
python是否有能力創建動態關鍵字?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,但是我需要爲解析的方法動態地創建關鍵字。 – user42876 2008-12-03 16:36:55
是的,有點。 在您的過濾器方法中,您可以聲明收集所有未知的通配符變量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)
謝謝,但不幸的是我沒有訪問函數本身(這是一個Django函數)。所以這個方法本身已經在尋找** kwargs,但是我需要爲解析的方法動態地創建關鍵字。 – user42876 2008-12-03 16:28:19
您可以輕鬆地做到這一點通過聲明你這樣的功能:
def filter(**kwargs):
的功能現在將通過一個名爲kwargs字典包含通過關鍵字和值到你的功能。請注意,在句法上,單詞kwargs
是沒有意義的; **
是導致動態關鍵字行爲的原因。
你也可以做相反的事情。如果你調用一個函數,你必須對應於參數的字典,你可以做
someFunction(**theDictionary)
還有一個較少使用的* foo的變種,這導致您收到的參數數組。這與正常的C可變參數陣列相似。
如果我理解你的要求正確,
qset.filter(**{
'min_price_' + selected_currency + '_range' :
(min_price, max_price)})
做你所需要的。
正是我需要的!謝謝。 – 2016-05-07 19:29:39
請參閱http://stackoverflow.com/questions/310732/in-django-how-does-one-filter-a-queryset-with-dynamic-field-lookups – 2008-12-03 17:56:14