Как справиться с «утиной типизацией» в Python?

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

Один из способов - заставить людей создать подкласс «интерфейсного» класса. Для меня это больше похоже на Java, чем на Python, и использование issubclass в каждом методе тоже не очень заманчиво.

Я предпочитаю добросовестно использовать объект, но это вызовет некоторые затруднения. AttributeErrors . Я мог бы заключить каждый опасный вызов в блок try / except. Это тоже кажется несколько громоздким:

def foo(obj):
    ...
    # it should be able to sleep
    try:
        obj.sleep()
    except AttributeError:
        # handle error
    ...
    # it should be able to wag it's tail
    try:
        obj.wag_tail()
    except AttributeError:
        # handle this error as well

Должен ли я просто пропустить обработку ошибок и ожидать, что люди будут использовать объекты только с необходимыми методами? Если я сделаю что-то глупое, например [x ** 2 for x in 1234] , я получу TypeError , а не AttributeError (целые числа не повторяются), поэтому где-то должна проводиться проверка типов - что, если я захочу сделать то же самое?

Этот вопрос будет открытым, но как лучше всего решить указанную выше проблему? Существуют ли какие-либо установленные передовые практики? Как, например, реализована итеративная «проверка типов», описанная выше?

Edit

Хотя AttributeError работают нормально, ошибки TypeErrors , вызываемые собственными функциями, обычно дают больше информации о том, как исправить ошибки. Возьмем, к примеру, следующее:

>>> ['a', 1].sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()

Я бы хотел, чтобы моя библиотека была максимально полезной.

26
задан André Laszlo 5 July 2011 в 23:57
поделиться