如何跳过在Python方法中提供默认参数

时间:2014-02-11 06:18:22

标签: python

我从Python boto2 library调用此方法:

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之后的参数有默认值,所以我不必指定它们的值。但是如果我想在最后传递一个参数的值呢?例如,我想为namemappercombiner参数提供值,并使用reducer的默认值。

我应该这样做:

boto.emr.step.StreamingStep('a name', 'mapper name', None, 'combiner name')

或者我应该在它之前明确地传递所有论据吗?

如果有100个参数,并且我只想为最后一个参数传递一个值,那么我必须向它传递许多默认值。有更简单的方法吗?

4 个答案:

答案 0 :(得分:7)

有两种方法可以做到这一点。第一个,最直接的,是传递一个命名参数:

boto.emr.step.StreamingStep(name='a name', mapper='mapper name', combiner='combiner name')

(注意,因为namemapper是有序的,所以不需要指定参数名称。


此外,您可以使用** argument unpacking

传递字典
kwargs = {'name': 'a name', 'mapper': 'mapper name', 'combiner': 'combiner name'}
boto.emr.step.StreamingStep(**kwargs)

答案 1 :(得分:2)

只需按关键字传递您想要的参数:boto.emr.step.StreamingStep(name='a name', mapper='a mapper', combiner='a combiner')

答案 2 :(得分:0)

  1. 不要使用位置参数,而是使用关键字参数。

  2. 如果必须使用位置参数,请使用* args list,使用循环或其他东西用默认值填充它,然后设置最后一个参数,然后将其传递给方法。

答案 3 :(得分:-1)

不,有一种(可能)更好的方法来做到这一点

当有默认值时,您可以指定要声明的参数,您只需像多个定义一样编写它。例如,假设您正在调用一个定义如下的函数:

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)