我有一堂课,开头如下:
from collections import namedtuple
class Parser:
Rule = namedtuple('Rule', ['lhs', 'rhs', 'dot_pos', 'start_pos', 'end_pos'])
# __init__ ...
由于 PyCharm 通过给我适当的建议正确地检测到了我所有的元组元素命名,我认为到目前为止我做的方法是正确的,Rule
使用上面显示的语法创建了一个小类。
现在,我的Parser
类中有一个带有Rule
参数的方法:
def add(self, dot_rule: Rule):
print(dot_rule.end_pos)
# ...
不幸的是,只要我尝试调用dot_rule
like的元素,就会出现以下错误end_pos
:
AttributeError: 'tuple' object has no attribute 'end_pos'
我在使用时误解了什么namedtuple
?
编辑:add
我用以下方式调用该方法,其中lhs
,rhs
和pos
是一些预先计算的值:
self.add((lhs, rhs, 0, pos, pos))
我认为因为namedtuple
据说与tuple
this 向后兼容将是正确的语法。显然,该参数现在被视为普通tuple
而不是Rule
. 我可以在这里做些什么不同的事情?
编辑 2:回溯消息:
Traceback (most recent call last):
File "...\earley.py", line 19, in <module>
main()
File "...\earley.py", line 14, in main
parser = Parser(grammar, lexicon, sentence)
File "...\parser.py", line 21, in __init__
self.parse(sentence)
File "...\parser.py", line 56, in parse
self.predict('S', i)
File "...\parser.py", line 41, in predict
self.add((lhs, rhs, 0, pos, pos)) # (X -> .α, i, i)
File "...\parser.py", line 24, in add
print(dot_rule.end_pos)
AttributeError: 'tuple' object has no attribute 'end_pos'
你可以试试这个:本质上你是在传递一个类元组而不是名为 Rule的命名元组。看:
代替 self.add((lhs, rhs, 0, pos, pos))
利用 self.add(Parser.Rule(lhs, rhs, 0, pos, pos))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句