2014-10-23 1 views
0

Я хотел бы улучшить реализацию моей модели, добавив некоторые проверки согласованности (это значение не может быть отрицательным, это не может быть None и т. Д.)Как (следует ли мне) реализовать согласованность модели в Python?

Я задавался вопросом, было ли это «Pythonic», чтобы добавить некоторые «проверки типа» также проверяются. Например, убедитесь, что объект, который я положил в свой автомобиль, действительно является SteeringWheel.

Я хочу выполнить некоторую проверку типа, чтобы как можно скорее уловить ошибки. Я хочу знать, добавил ли я правильный SteeringWheel, как только я поместил его в Car, а не когда автомобиль совершит свой первый поворот (а затем отлаживает мой путь через автокатастрофу, пока не нахожу ошибочное назначение).

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

Кроме того, какие атрибуты должны быть проверены? wheel.rotate() может применяться к рулевому колесу, но также к шине.

Другой способ, чтобы позволить модели, как это и окружают каждый использование объектной модели путем примерки улова, ожидая для AttributeError или TypeError, и это было бы весьма громоздким.

Возможно, я ошибаюсь, чтобы этого захотеть, и если кто-нибудь может убедить меня, что у меня есть неправильная идея, пожалуйста. Но если вы считаете, что я прав, чтобы получить модель, которая вызывает ошибку, когда она становится несовместимой, можете ли вы сказать мне, как сделать это, кроме использования isinstance()?

спасибо.

+1

возможно связанный: http://stackoverflow.com/questions/1275646/python-3-and-static-typing – ch3ka

+0

@ ch3ka Это очень интересный пост. Я не знал об аннотациях. – Mankalas

ответ

0

Вы можете использовать AbstractBaseClasses (https://docs.python.org/2/library/abc.html) здесь. Обоснование в pep 3119 (http://legacy.python.org/dev/peps/pep-3119/#rationale) - это точно о вашей проблеме (обеспечение объектива поддерживает данный протокол без специального контроля или жесткой типовой проверки).

+0

Насколько я понял этот PEP, ABC просто позволяет реализовать метод __instancecheck__' разработчиком и вызывается 'isinstance()'. Кроме, возможно, для сложных случаев, я не вижу, как это лучше, чем встроенный 'isinstance()'. – Mankalas

+0

@Mankalas: Там больше. Дело в том, что вы можете определить ABC (=> ожидаемый протокол) в одном пакете, совместимый класс во втором пакете и зарегистрировать этот второй класс как действительную реализацию вашей ABC в третьем пакете. Это означает, что любой существующий совместимый класс может быть использован без необходимости кодирования зависимостей/наследования и т. Д. FWIW, поскольку Python позволяет вам перепрограммировать методы и даже изменять класс объекта во время выполнения, даже «строгая» проверка типов обычно не защитит вас от ошибок времени выполнения, поскольку объект может изменить его класс после прохождения вашей typecheck

+0

Благодарим вас за объяснение. Кажется, я решаю свою проблему и соблюдаю философию философии утки. – Mankalas

 Смежные вопросы

  • Нет связанных вопросов^_^