使用变量作为预定义关键字(Python)的函数的关键字
我想创建一个简单的函数,它允许用户输入将更改日期时间对象的值的基本信息,并且我想通过使用变量作为关键字,找到一种尽可能干净的方法。这很容易以不同的方式完成,但我认为知道如何替换预设的关键字会很有用。使用变量作为预定义关键字(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),但我只是得到一个错误。
Python允许您将数据存储在字典中,并最终将它们作为关键字参数解包到不同的函数中。
对于你想要做的事情,最好的方法是使用kwargs。
replacement_info = {'day': 2, 'month': 9, ...}
new_time = start_time.replace(**replacement_info)
请注意与您所做的不同之处。直接传递time_type
到replace
,会导致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})
你不能在你没有写一个函数替换关键字参数。当调用的功能等:
f(a=b)
的a
的值不被发送作为参数f
。而是发送b
的值,并将该值设置为参数f's
参数列表定义。如果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)
建立的参数的字典,然后使用''**解压(见http://stackoverflow.com/q/36901/3001761 )。 – jonrsharpe