我正在尝试使用以下功能。通常,当我调用此函数时,我只是传递report_type,但是一些报告调用需要start_date。问题
函数定义中的None是否表示该字段是可选的
def request_report(self, report_type, start_date=None, end_date=None, marketplaceids=()):
data = dict(Action='RequestReport',
ReportType=report_type,
StartDate=start_date,
EndDate=end_date)
data.update(utils.enumerate_param('MarketplaceIdList.Id.', marketplaceids))
return self.make_request(data)
我通常使用下面的一行之一来调用该函数,具体取决于我是否传递了start_date。除此以外,对于每种请求类型都有一系列的“ if”语句,是否有一种好的方法来调用此函数,并且仅在填充了特定变量的情况下才传递该变量?随着时间的流逝,我将添加更多可选参数,并且确实想要一个巨大的'if'语句
requested_report=report_api.request_report(report_type=report_name, start_date=starting_date)
requested_report=report_api.request_report(report_type=report_name)
答案 0 :(得分:1)
=...
部分为参数提供默认值。这里是None
,这确实意味着在调用函数时参数是可选的。如果未指定,则使用默认值。请参见Python教程中的Default Argument Values以及reference documentation for function definitions:
当一个或多个参数的形式为 parameter = expression 时,该函数被称为具有“默认参数值”。对于具有默认值的参数,可以从a中省略相应的参数。调用,在这种情况下将替换参数的默认值。
调用此类函数时,可以将与默认值相同的值传递给该特定函数,这没有什么区别;因此,当没有starting_date
时,您可以传递None
:
start_date = starting_date or None # when determining the starting date, default to None
requested_report=report_api.request_report(
report_type=report_name,
start_date=starting_date
)
另一种选择是在字典中设置任何可选的关键字参数,然后将使用**
调用语法的参数传递给unpack the dictionary as keyword arguments:
kwargs = {}
if ...: # test that decides if start_date is needed
kwargs['start_date'] = starting_date # expression to set the start date
requested_report=report_api.request_report(
report_type=report_name, **kwargs)
kwargs
字典可以为空。
答案 1 :(得分:0)