1

Python の re モジュールを使用してクラスのインスタンスを作成できません。これが私がやろうとしていることです:

  1. 多くのデータ ファイルの各行をループします。
  2. 行がレコードの形式と一致する場合は、レコードの 2 つの値を属性として持つ Record クラスのインスタンスを作成します。

re次のコード フラグメントは、Record クラスのメソッドでモジュールによってキャプチャされた 5 つの大文字の文字列を出力することを期待していますterminal()が、明らかに何かを誤解しています。実際の出力はコードの下に続きます。

    class SrcFile:
       def __init__(self, which):
          self.name = which       

    class Record(SrcFile):       
       def terminal(self):
          recordline = re.compile(r"^([A-Z]{5})\s{3}")
          if recordline.match(self):
             m = recordline.match(self)
             return m.group(1)

    for f in files:
       file = SrcFile(f)
       for l in f:
          record = Record(f)
          print(record.terminal())

繰り返しますが、各レコード行に 5 つの大文字の文字列が表示されることを期待していますが、実際には次のようになります。

Traceback (most recent call last):
  File "./next.py", line 78, in <module>
    print(record.terminal())
  File "./next.py", line 63, in terminal
    if recordline.match(self):
TypeError: expected string or buffer

誰かがコードで理由を説明できると助かります。

for f in files:
   file = SrcFile(f)
   for l in f:
      record = Record(f)

の使用は明らかに間違っていますrecord = Record(file)。間違ったコードで record.method() を使用してファイルの SrcFile クラスのメソッドにアクセスできなかったため、試行錯誤してこれを発見しましたが、その理由はわかりません。

プログラミング全般、特に Python の経験が浅いことは明らかです。よろしくお願いします。

4

1 に答える 1

5

あなたは書くことを意味します

if recordline.match(self.name):

それよりも

if recordline.match(self):

を呼び出すときはre.match、文字列で行う必要があります。selfは文字列ではなくRecordオブジェクトself.nameですが、 は行に設定された文字列です

          self.name = which

他の質問に関連する基本的な問題がさらに 2 つあります。

  1. 行自体を使用することはありません。lこれが、ファイルを反復処理している理由です。おそらくあなたは書くつもりRecord(l)でした。

  2. SourceFileRecord クラスがオブジェクトを (コードで)継承するのはなぜですか?継承class Record(SourceFile)についてもっと注意深く読む必要があります。

于 2012-06-19T21:12:03.737 に答える