2017-05-24 147 views
0

有没有一种方法在Python中有条件地传递参数(我使用Python 2.7)?在Python函数调用中的条件参数

作为一个例子,这段代码给出了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], 
    ) 

我觉得用这种方式写它看起来有点多余。我已经看到了​​一些信息,我想应该是这样的:

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, 
) 

还是我缺少任何其他方式,这将是简单和干净吗?

+0

我的答案是否适合您? – e4c5

回答

2

你可以把它像:

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

你可能想改变my_method为这个适应;也许像def my_method(*args):

有关.get()字典方法的更多信息看看this

这个解决方案肯定是丑陋(符合美的Pythonic标准)比由@ e4c5提供的,但不需要函数变量具有与字典键相同的名称。

0

@ Ev.Kounis和@ e4c5都提供了很好的答案。就你在这个问题中所做的尝试而言,你只是缺少一个有效的条件表达式。

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

这实际上与@ Ev.Kounis提出的相同。

0

作为替代方案,我会考虑更改my_method以接受字典,如果您知道每次都会传递一个字典。

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

否则,其他答案也是有效的。