为什么我收到以下错误:
lhs_production = self.lhs()
NameError:
global name 'self' is not defined
以下是我写的代码:
class Grammar:
def lhs(self):
arrow_position = line.find('->')
if arrow_position == -1:
raise ValueError, 'No arrow position %s is found in %s' % (arrow_position, self.line)
lhs_g = self.line[0:arrow_position].strip(' ')
print "The Lhs for the line is: ", lhs_g
check_space = re.search("\s", lhs, re.M)
if check_space:
raise ValueError, 'There is still some space in the lhs of the line'
return self.lhs_g
def parse_line(line):
if len(line) == 0:
raise ValueError, 'No Line is found %s' % (line)
lhs_production = self.lhs()
rhs_predicates_production = rhs_predicates()
pattern_list_production = pattern_list()
return(lhs_production, rhs_predicates(), patterns())
答案 0 :(得分:2)
因为self
未在该函数的范围内定义:)。你的缩进是关闭的,你可能想要创建一个方法(所以缩进所有行),然后添加self
作为参数,在这种情况下,实例将采用名称self
。 / p>
还有其他一些需要注意的事项,仅仅是通过:
您应该使用if "->" in line:
而不是.find()
并检查它是否为-1
。为此,您的第一个函数似乎有NameError
,因为line
未在其第一行定义,而不确定您的意思。
你应该实例化异常,而不是为你做加注(所以,raise ValueError("some stuff")
您可以使用if not line
检查它是否为空行。
return
是一个声明,而不是一个函数,所以这样写它有点令人困惑。只要你愿意,只要在那里有一个空格,就可以使用return lhs_production, bla, bla
或者将它们放在那里。
干杯:)。
答案 1 :(得分:0)
self不是全局变量。它被传递给类方法。 parse_line函数是全局范围函数,而不是类方法。因此,self不存在于该函数的范围内。
任何使用self的方法都需要将self作为参数。
答案 2 :(得分:0)
除非你的缩进错误,否则在这种情况下没有自我。您需要引用对象的实例以在对象范围之外调用方法。无论如何self
真的只是一个标签;它只有惯例的特殊含义。你需要在那里的某个地方grammar=Grammar()
。