我从 Python boto2 库调用此方法:
boto.emr.step.StreamingStep(name, mapper, reducer=None, combiner=None, action_on_failure='TERMINATE_JOB_FLOW', cache_files=None, cache_archives=None, step_args=None, input=None, output=None, jar='/home/hadoop/contrib/streaming/hadoop-streaming.jar')
我知道
mapper
之后的参数有默认值,所以我不必指定它们的值。但是,如果我想在最后只为 one 参数传递一个值怎么办?例如,我想为 name
、mapper
和 combiner
参数提供值,并仅使用 reducer
的默认值。
我应该这样做吗:
boto.emr.step.StreamingStep('a name', 'mapper name', None, 'combiner name')
或者我应该明确传递之前的所有参数?
如果有 100 个参数,而我只想为最后一个参数传递一个值,那么我必须向它传递许多默认值。有没有更简单的方法来做到这一点?
有两种方法可以做到这一点。第一个,也是最直接的,是传递一个命名参数:
boto.emr.step.StreamingStep(name='a name', mapper='mapper name', combiner='combiner name')
(注意,因为
name
和 mapper
是有序的,所以不需要指定参数名称)
另外,你可以通过
**
参数解包传递字典:
kwargs = {'name': 'a name', 'mapper': 'mapper name', 'combiner': 'combiner name'}
boto.emr.step.StreamingStep(**kwargs)
只需通过关键字传递你想要的参数:
boto.emr.step.StreamingStep(name='a name', mapper='a mapper', combiner='a combiner')
不要使用位置参数,而是使用关键字参数。
如果必须使用位置参数,请使用 *args 列表,使用循环或其他方式用默认值填充它,并设置最后一个参数,然后将其传递给方法。
不,有一个(可能)更好的方法来做到这一点
当有默认值时,您可以指定要声明的参数,只需像多个定义一样编写即可。例如,假设您正在调用一个定义如下的函数:
def Method(param1=0, param2=0, param3=0, param4=0, param5=0):
print(str(param1 + param2 + param3 + param4 + param5))
您希望参数
param1
设为默认值 (0)。你可以像这样执行这个函数:
Method(param1= 5, param2= 4, param3= 3, param5= 8)