'str' object is not callable
来源:14-2 用字典映射代替switch case语句
慕粉2206119386
2018-05-07
day = 0
def get_sunday():
return 'Sunday'
def get_Monday():
return 'Monday'
def get_Tuesday():
return 'Tuesday'
switcher = {
0: 'Sunday',
1: 'Monday',
2: 'Tuesday'
}
day_name = switcher.get(day, 'Unknow')() #get方法访问 容错性 unknow为默认值
print(day_name)
2回答
-
码之力三段
2018-05-24
这样写:
day = 0 def get_sunday(): return 'Sunday' def get_Monday(): return 'Monday' def get_Tuesday(): return 'Tuesday' def default(): return 'Unknow' switcher = { 0: get_sunday(), 1: get_Monday(), 2: get_Tuesday() } day_name = switcher.get(day, default()) print(day_name)
10 -
慕粉916768
2019-08-17
你代码的主要错是字典中的value值不应该是字符串,而是一个变量形式(就是去掉单引号)。按照你写的这代码的意思相当于
'Sunday'()
这样的方式当然不能正确调用函数。一般来说,就是不能通过字符串来调用名字看起来相同的函数!
但是,Python是很强大的,可以以字符串的形式来调用函数。python为我们提供一个强大的内置函数:getattr。也就是Python中一个非常重要的机制:反射。
首先说明一下getattr函数的使用方法,它接收2个参数:
第一个参数是一个对象或者模块,这里是temp类。
后面的是一个字符串。就是对应的同名函数字符串。
为了简单,把涉及的函数都放到一个类中,并设置为静态方法,其实正规的方式是把这些函数都定义到一个单独的模块文件,然后import进来。
class temp(): @staticmethod def get_sunday(): return 'Sunday' @staticmethod def get_monday(): return 'Monday' @staticmethod def get_tuesday(): return 'Tuesday' @staticmethod def get_unknow(): return "I don't know!" funcs = { 0: 'get_sunday', 1: 'get_monday', 2: 'get_tuesday' } day = 1 a = getattr(temp,funcs.get(day,'get_unknow'))() print(a)
getattr函数让程序去temp这个类中,寻找通过字典获取的字符串的成员函数名,这个过程就相当于我们把一个字符串变成一个函数名的过程。
00
相似问题