Вызов метода в Python более эффективно - PullRequest
2 голосов
/ 31 июля 2011

Я новичок, работающий через Learn Python на нелегком пути.

Цель этого упражнения - написать сканер слов, который будет проходить тесты носа при запуске с помощью предоставленного модульного теста.

При выполнении тестов носа в следующем предоставленном модульном тесте я получал эту ошибку:

`TypeError: необязательный метод scan () должен вызываться с экземпляром лексикона в качестве первого аргумента (вместо этого получен экземпляр 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)])

После некоторого расследования я нашел здесь пользователя, который выполняет то же упражнение:

тесты на носу, питон

переменные Python, классы

Ответ на этот вопрос предполагает создание (создание экземпляра?) Метода внутри модульного теста. Поэтому я сделал следующую модификацию и записал свой класс в файл ex48.py, и он проходит тестирование носа.

Модифицированный тест

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

Я не уверен, что модульный тест должен был быть изменен. Я нашел подсказку о «непосредственном создании объекта» здесь:

Python: вызывает ли метод 'непосредственно' создание экземпляра объекта?

Но я не уверен, применимо ли это. Можно ли сделать сканер для создания самого экземпляра, или поставляемый модульный тест - это уловка «вопрос» и его нужно модифицировать?

Ответы [ 2 ]

4 голосов
/ 31 июля 2011

В онлайн-версии Learn Python The Hard Way у них есть:

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')])

для теста, что говорит о том, что вам нужен не класс лексики, а лексикон.py файл с функцией сканирования для проверки.

И он записан как экземпляр (как в примере с этим классом).

2 голосов
/ 31 июля 2011

Вы должны сохранить тест таким, каким он был, и использовать декоратор @staticmethod для метода сканирования.Таким образом, вы сможете вызывать метод непосредственно из класса без необходимости создавать объект для этого.

class lexicon(object):

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