繁体   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