【问题标题】:Python "Switch-Case" alternative showing errorPython“Switch-Case”替代显示错误
【发布时间】:2015-03-06 06:33:46
【问题描述】:

在遵循一些代码之后,我试图使用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

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

【问题讨论】:

    标签: python python-2.7 dictionary switch-statement


    【解决方案1】:

    代码中的实际问题是,您要针对键存储字符串值。当你这样做时,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] 将实际返回函数对象,您可以像尝试做的那样直接调用它。

    注意:这实际上称为“命令模式”。您可以在this answer 中阅读更多相关信息。


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

    【讨论】:

    • 隐藏在这个(正确)答案中的是,您还必须定义 case 字典定义函数之后。
    • @jedwards 哦,是的,我现在在回答中提到了这一点。
    • 第一种方法对我来说似乎很好。我不会尝试非推荐的。 :D
    • @Downvoter,如果你还在,请告诉我哪里出了问题以及如何改进这个答案。
    【解决方案2】:

    请更改它,您的代码将完成。

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

    【讨论】:

    • 这不是“开关盒替代品”。您也可以在 C 中执行此操作,但 switch-case 比这更有优势。
    【解决方案3】:

    这里是字典代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 2022-05-11
      • 2021-04-20
      相关资源
      最近更新 更多