有没有办法在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,
)
或者我想念的任何其他方式,这将是简单和干净的?
答案 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
...
否则,其他答案也有效。