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)古いものに基づいて新しい日時オブジェクトを取得することができます。

必ずしも 3 回実行する必要はありませんが、次のような方法が適している場合があります。

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ため、 を構築する必要があることに注意してください。また、値が 0 の場合も置換がないことを意味するため、チェックを外しました。dt.replaceNoneyear / month / dayis not None

于 2013-10-15T08:52:58.887 に答える