'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)
1
0

慕粉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这个类中,寻找通过字典获取的字符串的成员函数名,这个过程就相当于我们把一个字符串变成一个函数名的过程。

0
0

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14447 学习 · 4438 问题

查看课程