[问题] 为什么我自己重构的代码会出现KeyError,找不到字典,很费解.

来源:7-6 重构鱼书核心对象:YuShuBook 下

不明生物s

2020-01-19

view_models\book.py里的问题

"""
数据解析层
"""

class BookViewModel:
    def __init__(self,data):
        self.data = data
        self.book = {
            'title':data['title'],	#问题:出现KeyError: 'title'
            'publisher': data['publisher'],
            'pages':  data['pages'] or '',
            'author': '、'.join( data['author']),  # .join() 代表连接
            'price':  data['price'],
            'summary':  data['summary'] or '',
            'image':  data['image']
        }

    def package_single(self,keyword):
        returned = {
            'books': [],
            'total': 0,
            'keyword': keyword
        }
        if self.book:
            returned['total'] = 1
            returned['books'] = [self.book]
        return returned

    def package_collection(self,keyword):
        returned = {
            'books': [],
            'total': 0,
            'keyword': keyword
        }
        if self.book: #问题:一开始以为这里的问题,然后我把这个if的注释掉了,但是还是出现了KeyError: 'title'的错误
            returned['total'] = self.data['total']
            returned['books'] = [self.book for book in self.data['books']] #问题:这里的循环可能有写法问题,但是数据没有传入,我没办法解决这个问题
        return returned

以上是我重构代码的方案,这个方案没有之前重构spider里的yushu_book好,但是我是按照自己的思路来重构的.

1.最主要的问题是访问关键词查询后,构造函数中的self.book={‘title’:data[‘title’]}出现KeyError的报错,而且,只有关键字的索引会出现这样的问题,用isbn的索引不会出现问题,都是调用构造函数里的self.book{},为什么一个正常显示,一个出现差找不到字典,

我尝试了很多解决办法,包括断点调试和print()等方法,一步一步的排查,但很难理解,同样两个类方法,调用同一个实例变量,出现的结果竟然完全不同,.

使用的查询参数是:
ISBN查询:http://localhost:88/book/search/?q=9787070511209
图片描述

图片描述

2.因为我是按照自己的思路去重构代码,我会按照课程的代码重新敲一遍,.课程继续下去,但是不找到问题核心,感觉自己的思路出现了阻断.不知道我是哪一步写错了?

3.我把代码打包上传,麻烦老师有空查看下,主要模块为
视图函数模块:app\web\book.py
HTTP访问模块:spider\yushu_book.py
视图模型:view_models.py

不知道代码的传递方式.就用最笨的方法了

写回答

1回答

7七月

2020-01-23

这样的问题虽然你描述了很多但是我很难帮你定位问题,你需要 把问题稍微规整一下,直接描述问题的核心

0
2
7七月
回复
不明生物s
这个需要调试,一步步的跟踪变量的值得变化来分析,应该很容易找到答案。
2020-01-24
共2条回复

Python Flask高级编程之从0到1开发《鱼书》精品项目

7月老师深入浅出剖析Flask核心机制,和你一起探讨Python高级编程

2735 学习 · 1267 问题

查看课程