Python方法和“开关”

时间:2016-08-08 20:51:39

标签: python

我正在尝试使用字典作为开关语句,如

def add(first, second):
    return first + second

def sub():
    ...
    return something

operations = {
    "Add": add,
    "Sub": sub
}

ret_val = operations[operation]

现在我如何将参数传递给add和sub并获得它们的响应?目前,我没有传递任何方法,并测试ret_val。我看到的是被调用的操作,但是返回并没有回来。我得到的是指向操作方法的指针。

谢谢!

3 个答案:

答案 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

一个技术说明是命名argskwargs纯粹是Python中的惯例。你可以随意打电话给他们。这里有一个讨论两个问题的答案:https://stackoverflow.com/a/36908/149428

请注意,我没有进行任何输入验证,以达到简单,专注的答案。如果您正在收到用户的意见,那么这是一个值得记住的重要步骤。