2016-09-16 80 views
0

我想創建一個簡單的函數,它允許用戶輸入將更改日期時間對象的值的基本信息,並且我想通過使用變量作爲關鍵字,找到一種儘可能乾淨的方法。這很容易以不同的方式完成,但我認爲知道如何替換預設的關鍵字會很有用。使用變量作爲預定義關鍵字(Python)的函數的關鍵字

DateTime對象有一個.replace()方法,它的任何時間值作爲關鍵字:

datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])

但我想允許用戶指定多少哪一種時間(例如,2天; 4小時; 1個月)。

我試圖取代任何上述關鍵字上升到「分」與任何用戶輸入,存儲在time_type變量,但我得到「類型錯誤:‘time_type’是一個無效的關鍵字該功能的參數「。

start_time = datetime.datetime(2016, 09, 16, 15, 30) 

    def change_time(integer, time_string): 
     time_type = time_string.replace("s","") # de-pluralizes input 
     new_time = getattr(start_time, time_type) + integer 
     print(start_time.replace(time_type=new_time)) 

    change_time(2, "days") 

這應該打印新的start_time,它是(2016,09,18,15,30),但我只是得到一個錯誤。

+0

建立的參數的字典,然後使用''**解壓(見http://stackoverflow.com/q/36901/3001761 )。 – jonrsharpe

回答

0

Python允許您將數據存儲在字典中,並最終將它們作爲關鍵字參數解包到不同的函數中。

對於你想要做的事情,最好的方法是使用kwargs。

replacement_info = {'day': 2, 'month': 9, ...} 

new_time = start_time.replace(**replacement_info) 

請注意與您所做的不同之處。直接傳遞time_typereplace,會導致replace被稱爲與time_type參數,設置爲2,這是不確定的(因爲它是不是在允許的參數列表進行替換)

相反,你必須通過它像**{time_type: 2}到替換函數,這樣,替換將接收time_type的解釋值,即day,作爲輸入。

所以,你需要改變

print(start_time.replace(time_type=new_time)) 

print(start_time.replace(**{time_type:new_time}) 
1

你不能在你沒有寫一個函數替換關鍵字參數。當調用的功能等:

f(a=b) 

a的值不被髮送作爲參數f。而是發送b的值,並將該值設置爲參數f's參數列表定義。如果f沒有定義參數a(因爲datetime.replace沒有定義time_type參數),您將得到一個invalid keyword argument例外。

正如其他人所說,要將動態關鍵字參數傳遞給函數,請使用**kwargs表示法。

0

你的最後一行更改爲這樣的事情:

year = start_time.year 
month = start_time.month 
day = start_time.day 
hour = start_time.hour 
minute = start_time.minute 
second = start_time.second 
microsecond = start_time.microsecond 
exec(time_type + '='+str(new_time)) 
print(start_time.replace(year, month, day, hour, minute, second, microsecond) 
相關問題