我正在尝试使用字典作为开关语句,如
def add(first, second):
return first + second
def sub():
...
return something
operations = {
"Add": add,
"Sub": sub
}
ret_val = operations[operation]
现在我如何将参数传递给add和sub并获得它们的响应?目前,我没有传递任何方法,并测试ret_val。我看到的是被调用的操作,但是返回并没有回来。我得到的是指向操作方法的指针。
谢谢!
答案 0 :(得分:1)
要调用函数,请将参数放在括号后面,就像直接按名称调用函数一样。
ret_val = operations[operation](1, 2)
请注意,要使其正常工作,operations
中的所有函数都需要使用相同数量的参数。因此,如果add()
有两个参数,但sub()
没有参与,那么它就无法工作,正如您所示。
如果函数可以使用不同数量的参数,则可以将参数放在列表中并使用解包运算符。
args = (1, 2)
ret_val = operations[operation](*args)
然后,您必须确保args
包含特定操作的适当数量的参数。
答案 1 :(得分:0)
字典包含可调用函数。要调用它们,只需在括号中添加参数。
operations[operation](arg1, ...)
答案 2 :(得分:0)
所以,你缺少的主要是执行函数调用。提供的代码正确地抓取函数引用,但是你需要parens来执行它。
一旦执行它,你需要一些方法来传递参数。因为args的数量因函数而异,所以最好的方法是传递可变数量的args列表(*args
)和关键字参数字典(**kwargs
)。
我已经稍微填写了你的伪代码,所以这些运行:
def add(first, second):
return first + second
def sub(first, second):
return first - second
operations = {
"Add": add,
"Sub": sub,
}
使用args调用add:
op = 'Add'
op_args = [1, 2]
op_kwargs = {}
ret_val = operations[operation](*op_args, **op_kwargs)
print(ret_val)
3
使用kwargs调用add:
op = 'Add'
op_args = []
op_kwargs = {'first': 3, 'second': 4}
ret_val = operations[operation](*op_args, **op_kwargs)
print(ret_val)
7
如果你试图以冲突的方式传递args和kwargs,它将会失败:
# WON'T WORK
op = 'Add'
op_args = [1, 2]
op_kwargs = {'first': 3, 'second': 4}
ret_val = operations[operation](*op_args, **op_kwargs)
print(ret_val)
TypeError:add()获得参数'first'的多个值
但你可以以互补的方式使用两者:
op = 'Add'
op_args = [1]
op_kwargs = {'second': 4}
ret_val = operations[operation](*op_args, **op_kwargs)
print(ret_val)
5
一个技术说明是命名args
和kwargs
纯粹是Python中的惯例。你可以随意打电话给他们。这里有一个讨论两个问题的答案:https://stackoverflow.com/a/36908/149428。
请注意,我没有进行任何输入验证,以达到简单,专注的答案。如果您正在收到用户的意见,那么这是一个值得记住的重要步骤。