Python 函数调用中的条件参数
Conditional arguments in Python function call
有没有办法在 Python 中有条件地传递参数(我使用 Python 2.7)?
例如,此代码给出 2 个或 3 个参数,具体取决于字典中是否存在第 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,
)
或者我想念的任何其他方式,那会简单干净吗?
你可以这样称呼它:
my_method(my_dict[arg1], my_dict[arg2], my_dict.get(arg3, None))
您可能需要更改 my_method
以适应这一点;可能类似于 def my_method(*args):
。
有关 .get()
字典方法的更多信息,请查看 this。
这个解决方案肯定比@e4c5 提供的解决方案更丑(符合 Pythonic 的美标准),但不需要函数变量与字典键。
假设你的方法签名是
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 的一个(我不隶属于)
@Ev.Kounis 和@e4c5 都提供了很好的答案。就您在问题中所做的尝试而言,您只是缺少一个有效的条件表达式。
my_method(
my_dict[arg1],
my_dict[arg2],
my_dict[arg3] if arg3 in my_dict else None,
)
这实际上与@Ev.Kounis提出的相同。
作为替代方案,我会考虑更改 my_method 以接受一个字典,如果你知道你每次都会传递一个字典。
def my_method(d):
a1 = d[arg1]
a2 = d[arg2]
a3 = d[arg3] if 'arg3' in d else None
...
否则,其他答案也有效。
有没有办法在 Python 中有条件地传递参数(我使用 Python 2.7)?
例如,此代码给出 2 个或 3 个参数,具体取决于字典中是否存在第 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,
)
或者我想念的任何其他方式,那会简单干净吗?
你可以这样称呼它:
my_method(my_dict[arg1], my_dict[arg2], my_dict.get(arg3, None))
您可能需要更改 my_method
以适应这一点;可能类似于 def my_method(*args):
。
有关 .get()
字典方法的更多信息,请查看 this。
这个解决方案肯定比@e4c5 提供的解决方案更丑(符合 Pythonic 的美标准),但不需要函数变量与字典键。
假设你的方法签名是
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 的一个(我不隶属于)
@Ev.Kounis 和@e4c5 都提供了很好的答案。就您在问题中所做的尝试而言,您只是缺少一个有效的条件表达式。
my_method(
my_dict[arg1],
my_dict[arg2],
my_dict[arg3] if arg3 in my_dict else None,
)
这实际上与@Ev.Kounis提出的相同。
作为替代方案,我会考虑更改 my_method 以接受一个字典,如果你知道你每次都会传递一个字典。
def my_method(d):
a1 = d[arg1]
a2 = d[arg2]
a3 = d[arg3] if 'arg3' in d else None
...
否则,其他答案也有效。