这是一个包含两个类的模块:
import datetime
# Store the next available id for all new notes
last_id = 0
class Note:
'''Represent a note in the notebook. Match against a string
in searches and store tags for each note.'''
def __init__(self, memo, tags=''):
'''initialize a note with memo and optional
space-sparated tags. Automatically set the note's
creation date and a unique id.'''
self.memo = memo
self.tags = tags
self.creation_date = datetime.date.today()
global last_id
last_id += 1
self.id = last_id
def match(self, filter):
'''Determine if this note matches the filter
text. Return True if it matches, False otherwise.
Search is case sensitive and matches both text and tags.'''
return filter in self.memo or filter in self.tags
class Notebook:
'''Represent a collection of notes that can be tagged,
modified, and searched.'''
def __init__(self):
'''Initialize a notebook with an empty list.'''
self.notes = []
def new_note(self, memo, tags = ''):
'''Create a new note and add it to the list.'''
self.notes.append(Note(memo, tags))
def modify_memo(self, note_id, memo):
'''Find the note with the given id and change its
memo to the given value.'''
for note in self.notes:
if note.id == note_id:
note.memo = memo
break
def modify_tags(self, note_id, tags):
'''Find the note with the given id and change its
tags to the given value.'''
for note in self.notes:
if note.id == note_id:
note.tags = tags
break
def search(self, filer):
'''Find all notes that match the given filter
string.'''
return [note for note in self.notes if note.match(filter)]
当我创建Notebook()
的实例并执行search("hello")
时,发生了TypeError
。
>>> from notebook import Note, Notebook
>>> n = Notebook()
>>> n.new_note("hello world")
>>> n.new_note("hello again")
>>> n.notes
[<notebook.Note object at 0x02A2F5F0>, <notebook.Note object at 0x02A51D90>]
>>> n.search("hello")
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
n.search("hello")
File "C:/Users/James/Desktop/Python3OOP/Cahpter2Notebook\notebook.py", line 60, in search
return [note for note in self.notes if note.match(filter)]
File "C:/Users/James/Desktop/Python3OOP/Cahpter2Notebook\notebook.py", line 60, in <listcomp>
return [note for note in self.notes if note.match(filter)]
File "C:/Users/James/Desktop/Python3OOP/Cahpter2Notebook\notebook.py", line 27, in match
return filter in self.memo or filter in self.tags
TypeError: 'in <string>' requires string as left operand, not type
错误告诉我filter
中的Note.match
必须是string
,但当我执行n.search("hello")
时,"hello"
已经是一个字符串。
有人能告诉我里面真的有什么不对吗? THX !!!
答案 0 :(得分:2)
您使用的是filter
,但变量在函数的签名中声明为filer
:
def search(self, filer):
所以它可能需要一个不同的filter
来自外部作用域(感谢@grc - filter是一个内置函数),它没有被定义为字符串。