2016-05-03 127 views
3

有一些StackOverflow問題詢問有關使用變量作爲變量(如thisthis,但我不認爲這是重複的這些。我想知道如果我可以使用的值。變量作爲函數參數我可以使用變量的值作爲函數的參數名稱嗎?

例如,假設我要打電話將填充兩種不同的MySQL表一個函數:

  • 表的列idfullname
  • 手機表的列idphonenum
data = get_data()     # data = a full name or a phone number 
data_type = get_data_type(data) # data_type = "name" or "phone" 
.... 
column_names_for_tables = {'name': 'fullname', 'phone': 'phonenum'} 
column_name = column_names_for_tables[data_type] 
# column_name now = "fullname" or "phonenum", depending on the value of #data 

new_entry = MakeNewEntry(date=datetime.datetime.now(), id=123, <column_name>=data) 

課程,最後一行是無效的蟒蛇,但我的目標是動態生成的函數調用:

new_entry = MakeNewEntry(date=datetime.datetime.now(), id=123, fullname=data) 

new_entry = MakeNewEntry(date=datetime.datetime.now(), id=123, phonenum=data) 

也就是說,我想使用column_name的值作爲我的參數的名稱。

我可以這樣做嗎?

(在這個例子中,請假設MakeNewEntry()是不是我的控制之下 - 它將接受dateidphonenumfullname參數,但不能進行重構。)

回答

1

可以使用double star operator在任意的參數傳遞給函數:

col = 'foo' 
val = 'bar' 
kwargs = {col: bar} 

some_function(**kwargs) 

而且你可以作出這樣短的內聯詞典就像這樣:

some_function(**{col: var}) 

你可以混合和匹配的語法和使用這樣的事情結束了:

MakeNewEntry(date=datetime.datetime.now(), id=123, **{column_name: data}) 
+0

完美的作品 - 謝謝! –

相關問題