0

以下に示すエラーが表示される理由:

lhs_production = self.lhs()  

名前エラー: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())
4

3 に答える 3

2

selfその関数のスコープで定義されていないため:)。インデントがオフになっています。おそらく、それをメソッドにして(すべての行をインデントして)self、引数として追加するつもりでした。その場合、インスタンスは name になりselfます。

他にも注意すべき点がいくつかあります。

  • if "->" in line:ではなくを使用して、それが.find()であるかどうかを確認する必要があります-1。このため、最初の関数にはが含まれているようです。最初の行で定義されていないため、代わりに何を意味するのかわかりませんNameErrorline

  • raise を実行させるのではなく、例外をインスタンス化する必要があります (したがって、raise ValueError("some stuff")

  • if not line空白行かどうかを確認するために使用できます。

  • returnは関数ではなくステートメントなので、そのように書くと少し混乱します。return lhs_production, bla, bla必要に応じて、そこにスペースがある限り、その周りに括弧を使用または配置してください。

乾杯 :)。

于 2012-07-24T21:48:36.840 に答える
0

self はグローバル変数ではありません。クラスメソッドに渡されます。parse_line 関数はグローバル スコープ関数であり、クラス メソッドではありません。したがって、self はその関数のスコープには存在しません。

self を使用するメソッドはすべて、self をパラメーターとして受け取る必要があります。

于 2012-07-24T21:48:52.080 に答える
0

インデントが間違っていない限り、そのコンテキストには自己はありません。オブジェクトのスコープ外でメソッドを呼び出すには、オブジェクトのインスタンスを参照する必要があります。 selfとにかく、本当にただのラベルです。慣習上、特別な意味を持つだけです。あなたgrammar=Grammar()はそこのどこかに必要です。

于 2012-07-24T21:48:55.747 に答える