Можете ли вы обезопасить методы исправления для основных типов в Python? - PullRequest
47 голосов
/ 10 октября 2008

Ruby может добавлять методы в класс Number и другие основные типы для получения таких эффектов:

1.should_equal(1)

Но похоже, что Python не может этого сделать. Это правда? И если так, то почему? Это как-то связано с тем, что type нельзя изменить?

Обновление: вместо того, чтобы говорить о различных определениях исправлений обезьян, я хотел бы просто сосредоточиться на примере выше. Я уже пришел к выводу, что это невозможно сделать, поскольку некоторые из вас ответили. Но я хотел бы получить более подробное объяснение того, почему этого нельзя сделать, и, возможно, какая функция, если она доступна в Python, позволит это сделать.

Чтобы ответить на некоторые из вас: причина, по которой я мог бы захотеть сделать это, заключается просто в эстетике / удобочитаемости.

 item.price.should_equal(19.99)

Это больше похоже на английский и ясно указывает, какое значение является проверенным, а какое - ожидаемым, как предполагается:

should_equal(item.price, 19.99)

Эта концепция является основой Rspec и некоторых других платформ Ruby.

Ответы [ 14 ]

1 голос
/ 06 июня 2011

Кажется, вы действительно хотели написать:

assert item.price == 19.99

(Конечно, сравнение чисел с плавающей точкой на равенство или использование чисел с плавающей точкой - это плохая идея , поэтому вы должны написать assert item.price == Decimal(19.99) или любой числовой класс, который вы использовали для цены.)

Вы также можете использовать среду тестирования, такую ​​как py.test , чтобы получить больше информации о неудачных утверждениях в ваших тестах.

1 голос
/ 06 мая 2009

Что делает should_equal? Это логическое возвращение True или False? В этом случае пишется:

item.price == 19.99

Нет вкуса, но ни один обычный разработчик Python не сказал бы, что он менее читабелен, чем ваша версия.

Вместо should_equal устанавливается какой-либо тип валидатора? (почему валидатор должен быть ограничен одним значением? Почему бы просто не установить значение и не обновлять его после этого?) Если вам нужен валидатор, это никогда не сработает, так как вы предлагаете изменить либо целое число, либо все целые числа. (Валидатор, который требует 18.99 равным 19.99, всегда будет неуспешным.) Вместо этого вы можете записать его так:

item.price_should_equal(19.99)

или это:

item.should_equal('price', 19.99)

и определить соответствующие методы для класса или суперкласса предмета.

1 голос
/ 10 октября 2008

Нет, вы не можете сделать это в Python. Я считаю, что это хорошо.

0 голосов
/ 05 июня 2012

Вот как я могу добиться поведения .should_something ...:

result = calculate_result('blah') # some method defined somewhere else

the(result).should.equal(42)

или

the(result).should_NOT.equal(41)

Я включил метод декоратора для расширения этого поведения во время выполнения на автономный метод:

@should_expectation
def be_42(self)
    self._assert(
        action=lambda: self._value == 42,
        report=lambda: "'{0}' should equal '5'.".format(self._value)
    )

result = 42

the(result).should.be_42()

Вы должны немного знать о внутренностях, но это работает.

Вот источник:

https://github.com/mdwhatcott/pyspecs

Это также на PyPI под pyspecs.

...