使用变量作为预定义关键字(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),但我只是得到一个错误。

+0

建立的参数的字典,然后使用''**解压(见http://*.com/q/36901/3001761 )。 – jonrsharpe

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}) 

你不能在你没有写一个函数替换关键字参数。当调用的功能等:

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)