将默认值传递给 **kwargs

Passing default values to **kwargs

我有一个 returns 一些数据的函数,为了获取数据我需要做的是将 SQL 类查询传递给 build_query 变量。

def foo(client):
    """
    API service that returns JSON data and accepts arguments
    """
    report_query = (client.buildQuery()
                        .Select('Date','SearchEngine')
                        .From('Report_10')
                        .During('Yesterday')

    get_report.downloadReport(
            skip_header=True,
            include_names=False,
            get_summary=True,
            get_totals=False)

我想做的是将这个函数变成一个接受 **kwargs 但对所选字段具有默认参数的函数。

我的想法是,我可以将参数传递给 .During(),如果我不这样做,它默认为 Yesterday,我可以将参数传递给 .Select() ],例如 .Select() 将是 .Select('Date','Device','StrategyType').

我尝试过并试图理解的内容:

def fn(**kwargs):
    print(f"""
    ({kwargs['client']}.buildQuery()
     .Select({kwargs['select']}))
     .From({kwargs['report_type']})
     .During({kwargs['during']})

     get_report.downloadReport(
            skip_header={kwargs['skip_header']},
            include_names={kwargs['include_names']},
            get_summary={kwargs['get_summary']},
            get_totals={kwargs['get_totals']})""")
fn(client='10',select=['Date', 'SearchEngine'],report_type='new',during='Yesterday',skip_header=True)

Returns:

 (10.buildQuery()
     .Select(['Date', 'SearchEngine']))
     .From(new)
     .During(Yesterday)

     get_report.downloadReport(
            skip_header=True,
            include_names=False,
            get_summary=True,
            get_totals=False)

我被卡住的地方是尝试在没有任何关键字参数的情况下调用 fn(),并希望该函数对每个字段都有默认参数,这样它看起来就像我问题中的第一个代码片段。

fn()

KeyError: 'client'

有没有可能达到这样的效果?

您可以在字典上使用扩展运算符:

def func(**kwargs):
    kwargs = {"printer": None, **kwargs}

如果未给出,这会将值 printer 设置为 none。