📅  最后修改于: 2023-12-03 14:45:57.694000             🧑  作者: Mango
如果你在使用 Python 编写程序时,遇到了类似于“TypeError: new() got multiple values for argument 'day'” 的错误,并且提示错误仅与 datetimelike 值一起使用,那么切勿慌张,这篇文章会给你介绍其中的缘由以及解决方法。
首先,我们需要了解 datetimelike 是什么。根据文档的解释,datetimelike 是指任何具有 year、month 和 day 属性的对象。例如,datetime.datetime、pandas.Timestamp 等都是 datetimelike 对象。
出现 TypeError 错误的主要原因是因为你在调用某个函数时,错误地为参数传递了多个 datetimelike 对象。举个例子,下面的代码会出现这个错误:
import datetime
def foo(date):
print(date.year)
start = datetime.datetime(2021, 1, 1)
end = datetime.datetime(2021, 1, 31)
foo(start, end)
当你运行上面的代码时,会看到如下的错误消息:
TypeError: __new__() got multiple values for argument 'day'
在这个例子中,我们定义了一个叫做 foo 的函数,这个函数接受一个 datetimelike 对象作为参数,并打印出该对象的年份。我们分别定义了 start 和 end 两个 datetime.datetime 对象,并试图将它们作为参数传递给 foo 函数。然而,由于我们只在函数定义时指定了一个参数,因此 Python 会认为我们试图将 start 和 end 两个对象同时传递给 foo 函数的 date 参数,这会导致 day 参数被重复指定,最终导致了上面出现的错误。
为了解决这个问题,我们需要确保在调用函数时只传递一个 datetimelike 对象。可以有以下两种方法:
传递一个包含多个 datetimelike 对象的序列作为参数。这个序列可以是一个列表、元组、集合等。在函数内部,我们可以使用序列的索引来获取需要的 datetimelike 对象。
import datetime
def foo(dates):
for date in dates:
print(date.year)
start = datetime.datetime(2021, 1, 1)
end = datetime.datetime(2021, 1, 31)
foo([start, end])
使用关键字参数传递多个 datetimelike 对象。这个方法要求我们显式地指定每个参数的名称,避免了混淆的风险。
import datetime
def foo(start, end):
print(start.year, end.year)
start = datetime.datetime(2021, 1, 1)
end = datetime.datetime(2021, 1, 31)
foo(start=start, end=end)
无论你采用哪种方法,都需要确保在函数调用时只传递一个 datetimelike 对象,以避免出现上述错误。
希望这篇文章能帮助你更好地理解 Python 中的 datetimelike 对象,并解决遇到这类问题的困扰。