【问题标题】:Pythonic switch within class类内的 Pythonic 开关
【发布时间】:2017-10-24 10:47:27
【问题描述】:

我正在尝试在 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

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

【问题讨论】:

  • 该值为调用函数的结果。为什么不只存储字符串,然后在从字典中得到的任何内容上调用func?另外,为什么要打扰func,而它只是print
  • 如果你想存储值,func应该返回它的参数。现在你的字典全是无。

标签: python dictionary switch-statement


【解决方案1】:

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

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(...)()

【讨论】:

  • 对不起,示例不合适,我要调用的函数确实是可变的,因此您的lambda 表达式是关键!谢谢你的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多