如何在具有一长串具有默认值的命名参数的 Python 方法调用中跳过提供默认参数?

问题描述 投票:0回答:4

我从 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 个参数,而我只想为最后一个参数传递一个值,那么我必须向它传递许多默认值。有没有更简单的方法来做到这一点?

python parameter-passing keyword-argument
4个回答
24
投票

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

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)

5
投票

只需通过关键字传递你想要的参数:

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


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

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


-3
投票

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

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

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)
© www.soinside.com 2019 - 2024. All rights reserved.