Python "Switch-Case" 备选显示错误

Python "Switch-Case" alternative showing error

我在遵循一些代码后尝试使用 dictionaryPython 中实现 C 之类的 switch-case。我有以下代码。

case = {'1': "case_1", '2': "case_2"}


def case_1():
    print "case 1"


def case_2():
    print "case 2"

x = raw_input("Enter 1 or 2 :")

if x == '1' or x == '2':
    print case[x]
    case_1()
    case[x]()
else:
    print "Please enter 1 or 2 only"

我得到如下所示的输出和错误。

Enter 1 or 2 :1
case_1
case 1
Traceback (most recent call last):
  File "test.py", line 17, in <module>
    case[x]()
TypeError: 'str' object is not callable

谁能告诉我这里出了什么问题?

您的代码中的实际问题 是,您针对键存储字符串值。当你这样做时,case[x],它只给你字符串值,你正试图将它们作为函数调用。这就是为什么你得到

TypeError: 'str' object is not callable

您可以通过将函数对象本身存储在字典中来修复它,就像这样

def case_1():
    print "case 1"

def case_2():
    print "case 2"

case = {'1': case_1, '2': case_2}

现在,首先定义函数(这很重要,因为在定义之前不能使用函数对象),然后将它们存储在字典对象中。所以,当代码

case[x]()

执行后,case[x] 实际上会 return 函数对象,您可以像您尝试的那样直接调用它。

注:这个其实叫"Command Pattern"。您可以在 this answer.

中阅读更多相关信息

还有另一种方法可以使您的程序按原样运行。但我不推荐它。 您实际上可以通过从 globals() 字典中获取函数对象来调用与字符串对应的函数对象,例如 globals()[case[x]]().

请更改您的代码。

def case_1():
    print "case 1"


def case_2():
    print "case 2"

def run():
    x = int(raw_input("Enter 1 or 2 :"))
    print x
    if x == 1:
        case_1()
    elif x== 2:
        case_2()
    else:
        print "Please enter 1 or 2 only"

run()

字典代码如下:

def case_1():
    print "case 1"


def case_2():
    print "case 2"

def run():
    dic={1:case_1,2:case_2}
    x = int(raw_input("Enter 1 or 2 :"))
    if x == 1 or x == 2:
        dic[x]()
    else:
        print "Please enter 1 or 2 only"

run()