Python函数调用中的条件参数

时间:2017-05-24 15:20:00

标签: python python-2.7 if-statement coding-style arguments

有没有办法在Python中有条件地传递参数(我使用Python 2.7)?

作为示例,此代码根据字典中是否存在第3个参数,提供2个或3个参数。

if "arg3" in my_dict:
    my_method(
        my_dict[arg1],
        my_dict[arg2],
        my_dict[arg3],
    )
else:
    my_method(
        my_dict[arg1],
        my_dict[arg2],
    )

我觉得以这种方式写它看起来多余。我已经在argparse上看到了一些信息,我认为这看起来像这样:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument(my_dict[arg1])
parser.add_argument(my_dict[arg2])
if arg3 in my_dict:
    parser.add_argument(my_dict[arg3])
args = parser.parse_args()

my_method(args)

我也不太喜欢这种方法,因为它需要导入并且难以阅读。

有没有办法做类似的事情:

my_method(
    my_dict[arg1],
    my_dict[arg2],
    my_dict[arg3] if arg3 in my_dict,
)

或者我想念的任何其他方式,这将是简单和干净的?

4 个答案:

答案 0 :(得分:4)

假设您的方法签名是

def my_method(arg1=None, arg2=None, arg3=None):
    print ('arg1',arg1,'arg2',arg2,'arg3',arg3)

然后只需用

替换所有if / else块
my_method(**dictionary)

例如

 d = {'arg3':11, 'arg2':22, 'arg1':3}

以上将产生

arg1 3 arg2 22 arg3 11

**kwargs引发了这种行为。网上有很多很好的教程。这是来自digial ocean(我不隶属于)的一个

答案 1 :(得分:2)

您可以这样称呼它:

my_method(my_dict[arg1], my_dict[arg2], my_dict.get(arg3, None))

您可能希望更改my_method以适应此情况;也许像def my_method(*args):这样的东西。

有关.get()字典方法的详细信息,请查看this

这个解决方案肯定是 uglier (符合Pythonic的美容标准),而不是@ e4c5提供的,但不要求函数变量与字典键同名。

答案 2 :(得分:0)

@ Ev.Kounis和@ e4c5都提供了很好的答案。至于您在问题中所做的尝试,您只缺少有效的条件表达式。

my_method(
    my_dict[arg1],
    my_dict[arg2],
    my_dict[arg3] if arg3 in my_dict else None,
)
实际上,这与@ Ev.Kounis提出的相同。

答案 3 :(得分:0)

作为替代方案,如果你知道每次都会传入一个词典,我会考虑改变my_method以接受一个词典。

def my_method(d):
    a1 = d[arg1]
    a2 = d[arg2]
    a3 = d[arg3] if 'arg3' in d else None
    ...

否则,其他答案也有效。