Python "Switch-Case" 备选显示错误
Python "Switch-Case" alternative showing error
我在遵循一些代码后尝试使用 dictionary
在 Python
中实现 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()
我在遵循一些代码后尝试使用 dictionary
在 Python
中实现 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()