我有一些我正在使用的代码(specifically Parsetron),它是为Python 2.7编写的,我正在尝试使用python 3.4运行,并且毫不奇怪它正在抛出错误。
我特别关注的错误是:
def __new__(cls):
return cls.__dict__['_grammar_']
KeyError: '_grammar_'
cls
是类对象,它确实没有键“_grammar_
”。我的问题当然是如何摆脱这个错误以及它出现的原因。在python 2.7中,__dict__
是否为类对象添加了键值,而Python 3.x则没有?在调试期间运行该线程似乎不会在任何地方添加此值。有谁知道发生了什么事?
答案 0 :(得分:1)
查看代码,您可以看到Grammar._grammar_
类属性实际上是set by the metaclass:
dct["_grammar_"] = GrammarImpl(name, dct)
但是,Grammar
uses the 2.x syntax用于设置元类:
__metaclass__ = MetaGrammar
要对Python 3.x进行调整,请使用new syntax:
class Grammar(metaclass=MetaGrammar):