如何将关键字对作为参数传递给函数中的模块?

Posted

技术标签:

【中文标题】如何将关键字对作为参数传递给函数中的模块?【英文标题】:How do I pass a keyword pair as an argument to a module in a function? 【发布时间】:2022-01-11 09:01:58 【问题描述】:

下面是一个搜索日期列表并返回指定日期出现次数的函数。我可以通过调用zettel(1) 将天数传递给relativedelta(days=x),但我也想传递若干年(即relativedelta(years=x))。

from datetime import date, datetime, timedelta
from dateutil.relativedelta import relativedelta

notelist = ['20211204', '20201205', '20191205', '20181205']


def zettel(x):
    ''' Returns the number of zettel created on this day 'x' years ago.'''
    note_uuid = datetime.now() - relativedelta(days=x)
    note_count = 0
    for uuid in notelist:
        if uuid == note_uuid.strftime('%Y%m%d'):
            note_count += 1
    return [x, note_count, note_uuid.strftime('%Y%m%d')]


print(f'[zettel(1)[1] new zettel yesterday.') 

print(zettel(1))

我试过传入daysyears 和带有的号码

    note_uuid = datetime.now() - relativedelta(y=x)

但我明白了 NameError: name 'years' is not defined 当我用 print(f'[zettel(years, 1)[1])

我尝试将整个论点 days=1year=1 传递给

    note_uuid = datetime.now() - relativedelta(x)

但我明白了 TypeError: zettel() got an unexpected keyword argument 'years' 当我用 print(f'[zettel(years=1)[1])

如何将关键字“days”和“years”传递给函数 relativedelta?这可能吗?

此代码有效,但我想对其进行扩展,以便计算不同的天数或年数。

【问题讨论】:

【参考方案1】:

有几种不同的方法可以实现这一目标。

选项 1: 直接传递“天”和“年”。示例调用:zettel(years=1)

def zettel(years=0, days=0):
    note_uuid = datetime.now() - relativedelta(years=years, days=days)
    ...

选项 2: 直接传递 relativedelta。调用示例:zettel(relativedelta(years=1))

def zettel(lookback):
    note_uuid = datetime.now() - lookback
    ...

选项 3: 传递关键字参数。调用示例:zettel(years=1)

def zettel(**lookback):
    note_uuid = datetime.now() - relativedelta(**lookback)
    ...

【讨论】:

以上是关于如何将关键字对作为参数传递给函数中的模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何将关键字参数作为参数传递给函数?

如何将字典传递给带有关键字参数的函数?

如何将函数作为参数传递给OpenSCAD模块?

将对象作为参数传递给函数

将字典作为关键字参数传递给函数

如何将带有 args 的成员函数作为参数传递给另一个成员函数?