繁体   English   中英

Python方法和“开关”

[英]Python methods and “switches”

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

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

def sub():
    ...
    return something

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

ret_val = operations[operation]

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

谢谢!

要调用函数,请将参数放在括号后,就像直接按函数名称调用函数一样。

ret_val = operations[operation](1, 2)

请注意,为使此功能正常运行, operations所有功能都需要采用相同数量的参数。 因此,如您所示,如果add()接受两个参数,而sub()不接受两个参数,那么它将不起作用。

如果函数可以使用不同数量的参数,则可以将参数放在列表中并使用解压缩运算符。

args = (1, 2)
ret_val = operations[operation](*args)

然后,您只需要确保args包含用于特定操作的适当数量的参数即可。

字典包含可调用的函数。 要调用它们,只需在括号中添加参数即可。

operations[operation](arg1, ...)

因此,您最缺少的是执行函数调用。 提供的代码可以正确获取功能引用,但是您需要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

请注意,出于简单而集中的答案,我没有进行任何输入验证等。 如果您从用户那里得到输入,那是要记住的重要步骤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM