簡體   English   中英

使用變量作為具有預定義關鍵字的函數的關鍵字 (Python)

[英]Use variables as keywords for functions with pre-defined keywords (Python)

我正在嘗試創建一個簡單的函數,該函數允許用戶輸入將更改 datetime 對象值的基本信息,並且我想找到一種方法,通過使用變量作為關鍵字來使其盡可能干凈. 這可以通過不同的方式輕松完成,但我認為了解如何替換預設關鍵字會很有用。

datetime 對象有一個 .replace() 方法,該方法將任何時間值作為關鍵字:

datetime.replace([年[, 月[, 日[, 小時[, 分鍾[, 秒[, 微秒[, 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),但我只是收到一個錯誤。

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

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

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

new_time = start_time.replace(**replacement_info)

注意與你所做的不同。 time_type直接傳遞給replace ,將導致使用time_type參數調用replace ,該參數設置為 2,這是未定義的(因為它不在接受的替換參數列表中)

相反,您必須像**{time_type: 2}一樣將它傳遞給替換函數,這樣,替換將接收 time_type 的解釋值,即日,作為輸入。

所以你需要改變

print(start_time.replace(time_type=new_time))

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

您不能替換不是您編寫的函數的關鍵字參數。 調用如下函數時:

f(a=b)

的值a不發送作為參數f 而是發送b的值,並將該值設置為f's參數列表定義中的參數a 如果f沒有定義參數a (因為datetime.replace沒有定義time_type參數),你會得到一個invalid keyword argument異常。

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

將最后一行更改為如下所示:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM