Changing calling sequence

David Raymond David.Raymond at tomtom.com
Wed May 11 15:01:16 EDT 2022


>> I have a function that I use to retrieve daily data from a
>> home-brew database. Its calling sequence is;
>> 
>> def TempsOneDay( year, month, date ):
>> 
>> After using it (and its friends) for a few years, I've come to
>> realize that there are times where it would be advantageous to
>> invoke it with a datetime.date as its single argument.
>
>You could just use all keyword args:
>
>def TempsOneDay(**kwargs):
>
>         if 'date' in kwargs:
>                 handle_datetime(kwargs['date'])
>         elif 'year' in kwargs and 'month' in kwargs and 'day' in kwargs:
>                 handle_args(kwargs['year'], kwargs['month'], kwargs['day'])
>         else:
>                 raise Exception("Bad keyword args")
>
>TempsOneDay(date=datetime.datetime.now)
>
>TempsOneDay(year=2022, month=11, day=30)
>

Maybe not the prettiest, but you could also define it like this, which also wouldn't require changing of any existing calls or the main body of the function past this if block.

def TempsOneDay(*dateComponents):
    if len(dateComponents) == 3:
        year, month, date = dateComponents
    elif len(dateComponents) == 1 and isinstance(dateComponents[0], datetime.date):
        year, month, date = (dateComponents[0].year, dateComponents[0].month, dateComponents[0].day)
    else:
        raise Exception("Error message here")


More information about the Python-list mailing list