在python中调用函数时出现名称错误

时间:2012-07-24 21:46:21

标签: python nameerror

为什么我收到以下错误:

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())

3 个答案:

答案 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()