我使用Python来实现一个Earley Parser,它具有如下定义的Context Free规则:
class Rule:
def __init__(self,string,i,j,dot):
self.i = 0
self.j = 0
self.dot = 0
string = string.split('->')
self.lhs = string[0].strip()
self.rhs1 = string[1].strip()
self.rhs = []
self.rhs1 = self.rhs1.split(' ')
for word in self.rhs1:
if word.strip()!= '':
self.rhs.append(word)
def __eq__(self, other):
if self.i == other.i:
if self.j == other.j:
if self.dot == other.dot:
if self.lhs == other.lhs:
if self.rhs == other.rhs:
return True
return False
要检查图表数组中是否存在类Rule
的对象,我使用了以下内容:
def enqueue(self, entry, state):
if state in self.chart[entry]:
return None
else:
self.chart[entry].append(state)
其中chart是一个数组,应该包含类Rule
的对象列表:
def __init__(self, words):
self.chart = [[] for i in range(len(words))]
此外,我检查规则是否存在于chart[entry]
中,如下所示(如果它不存在,则只需追加):
def enqueue(self, entry, state):
if state in self.chart[entry]:
return None
else:
self.chart[entry].append(state)
然而,这给我一个错误
TypeError: 'in <string>' requires string as left operand, not classobj
为了避免这种情况,我甚至在课堂上宣布了一个__eq__
函数,但它似乎没有用。任何人都可以帮助我吗?
答案 0 :(得分:0)
假设您的对象只有一个与相等性相关的title属性,您必须按如下方式实现__eq__
方法:
class YourObject:
[...]
def __eq__(self, other):
return self.title == other.title
当然,如果您有更多与平等相关的属性,那么您也必须包含这些属性。您也可以考虑实施__ne__
和__cmp__
以保持一致的行为。