9

我正在尝试实现一个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

4

2 回答 2

21

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)
于 2013-10-15T08:45:12.290 回答
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 值也意味着没有替换。

于 2013-10-15T08:52:58.887 回答