2011-07-30 22 views
2

私は、難解な方法でPythonを学習するnewbです。Pythonでメソッドをより効率的に呼び出す

この練習のポイントは、提供された単体テストで実行されるときにnosetestsを通過するための単語スキャナを書くことです。

`TypeError例外::私はこのエラーになっていた以下の提供ユニットテストでnosetestsを実行中

辞書インスタンスで呼び出されなければならない)、非結合方式のスキャンを(最初の引数は

(代わりにstrのインスタンスを得た)としてレッスンが提供するテスト

from nose.tools import * 
from ex48 import lexicon 

def test_directions(): 
    assert_equal(lex.scan("north"), [('direction', 'north')]) 
    result = lex.scan("north south east") 
    assert_equal(result, [('direction', 'north'), 
          ('direction', 'south'), 
          ('direction', 'east)]) 

私はここに同じ運動を通じて取り組んでいるユーザーを見つけたいくつかの調査の後:

nosetests, python

python variables, classes

が答えが(instaniating?)インスタンス提案単体テスト内部方法。だから私は次の修正を行い、ファイルex48.pyでクラスを書き留め、それはnosetestsを渡します。

修正テスト

from nose.tools import * 
from ex48 import lexicon 


def test_directions(): 
    lex = lexicon("north") 
    assert_equal(lex.scan("north"), [('direction', 'north')]) 
    lex = lexicon("north south east") 
    result = lex.scan("north south east") 
    assert_equal(result, [('direction', 'north'), 
          ('direction', 'south'), 
          ('direction', 'east')]) 

ex48.py - スキャナ

class lexicon(object): 

    def __init__(self, data): 
     #nosetests fails me if I don't put in some dummy 
     # __init__ function with a dummy line, not sure why. 
    self.direction = data 

    def scan(self, data): 
     split_data = data.split() 
     directions = ['north', 'south', 'east', 'west'] 
     data_reply = [] 
     #for loop for the length of the list 
     for split_data_item in split_data: 
      #If data is in the directions list 
      if split_data_item in directions: 
       #Add [('direction', data)] to a dict 
       data_reply.append(('direction', split_data_item)) 

     #Return the list 
     return data_reply 

私はユニットテストが変更されることを意図したかはわかりません。私はここで「オブジェクトを直接intantiating」についての手掛かりが見つかりました:

Python: does calling a method 'directly' instantiate the object?

をしかし、これが適用されるかどうかわからないです。スキャナをインスタンス化するためにスキャナを作成することはできますか、または提供されたユニットはトリック「質問」をテストし、変更する必要がありますか?

答えて

2

あなたはテストを元の状態に保ち、スキャン方法に@staticmethodデコレータを使用する必要があります。この方法では、オブジェクトをインスタンス化する必要なく、クラスから直接メソッドを呼び出すことができます。あなたは辞書クラスを必要としないことを示唆しているテスト、それだけにはスキャン機能付きlexicon.pyファイルの

def test_directions(): 
    assert_equal(lexicon.scan("north"), [('direction', 'north')]) 
    result = lexicon.scan("north south east") 
    assert_equal(result, [('direction', 'north'), 
          ('direction', 'south'), 
          ('direction', 'east')]) 

:彼らが持っているLearn Python The Hard Wayのオンライン版で

class lexicon(object): 

    @staticmethod 
    def scan(data): 
     #do the stuff here 
+0

これはちょっとした修正が加えられました: 'def scan(data):'ありがとうございました。 :) –

+0

@スティーブナロー:ありがとう、私は私の答えを編集しました。 –

4

テスト。

(私はこのクラスのインスタンスを作っているように)インスタンス化が綴られています。

+0

ああ、私の悪いところ、私は元のペーストをコピーしませんでしたが、余分な行を修正して削除しました。ありがとうございました。 –

+0

そしてlexicon.pyファイルを使ってこれを試して、インポートを変更しました。同様に動作します。ムチャス。 –

関連する問題