类内的 Pythonic 开关

标签 python dictionary switch-statement

我正在尝试在 python 中构建开关逻辑。

基于 Replacements for switch statement in Python?我构建了以下代码:

def func(string):
    print(string)

class Switch:
    def __init__(self):
        pass

    def first_switch(self, case):
        return {
             '1': func('I am case 1'),
             '2': func('I am case 2'),
             '3': func('I am case 3'),
             }.get(case, func('default'))


switch = Switch()
switch.first_switch('2')

这将给我输出:

I am case 1
I am case 2
I am case 3
default

我希望输出是

I am case 2

这个字典大小写逻辑是否只适用于类定义之外,还是我错过了一些额外的代码?看起来所有字典键值对都在函数调用时求值。

最佳答案

在构建字典时,您总是会调用所有这些函数。它与类无关。

d = {'foo': bar()}

bar 在这里被调用,它的返回值分配给 d['foo']。请记住,这不是 switch 语句;它是一个字典文字,用于模拟 switch 语句。

在您的情况下,该函数不是可变的,因此根本不必包含在内:

arg = {
    '1': 'I am case 1',
    '2': 'I am case 2',
    '3': 'I am case 3',
}.get(case, 'default')
func(arg)

如果该函数也是可变的,您希望使字典值成为可调用函数,在调用时将调用该函数:

{'1': lambda: func('I am case 1'), ...}.get(...)()
                    # call the function you got ^^

或者也许:

from functools import partial

{'1': partial(func, 'I am case 1'), ...}.get(...)()

关于类内的 Pythonic 开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46908510/

相关文章:

swift - 按下按钮后使用 case 语句检查值的状态

c++ - Switch Case 总是默认

python - 根据单元格字符串拆分数据框

python - 在 python 教程中的 webscraping 之后,他们使用 urllib 我使用 requests 帮助翻译指令

python - 从字典更新列中组的值

vim - 在 Vim 中阻止注释然后取消突出显示

python - 将字典转换为对象时出现的问题

python - 使用 Python 字典触发 Break 关键字

python - 将模式保存/加载匹配器作为新的管道组件

python - 禁用 python chrome 驱动程序扩展而不丢失驱动程序路径