我正在尝试实现一个get_date
函数,我想用它来构建更高级别的函数(例如,下面给出的get_payment_date
)。这是我的代码:
from datetime import datetime
def get_date(year=None, month=None, day=None):
'''Returns now, with the given parts overwritten'''
dt = datetime.now()
if not year is None : dt.year = year
if not month is None : dt.month = month
if not day is None : dt.day = day
return dt
def get_payment_date():
return get_date(day=15)
print get_payment_date()
但如果失败了:
AttributeError: attribute 'day' of 'datetime.date' objects is not writable
我明白了。我怎么解决这个问题?我怎样才能“覆盖”now
的某些部分?
答案 0 :(得分:12)
datetime.datetime
和datetime.date
个对象是不可变的。
您可以dt = dt.replace(year = year)
根据旧日期对象获取新的日期时间对象。
你不一定要这样做三次,但这样的事情可能适合你:
def get_date(**kwargs):
'''Returns now, with the given parts overwritten'''
dt = datetime.now()
# optionally, depending on intended use of this function
kwargs = { k : v for k,v in kwargs.items() if v is not None }
return dt.replace(**kwargs)
答案 1 :(得分:1)
这就是我想要的(感谢Steve Jessop):
from datetime import datetime
def get_date(year=None, month=None, day=None):
'''Returns now, with the given parts overwritten'''
dt = datetime.now()
kwargs = {}
if year : kwargs['year'] = year
if month : kwargs['month'] = month
if day : kwargs['day'] = day
if kwargs : return dt.replace(**kwargs)
else : return dt
def get_payment_date():
return get_date(day=15)
print get_payment_date()
请注意,我需要构建kwargs
,因为dt.replace
不接受None
作为year / month / day
的值。此外,我删除了is not None
检查,因为0值也意味着没有替换。