Обычно я хочу, чтобы мой код был как можно более общим. В настоящее время я пишу простую библиотеку, и на этот раз возможность использовать разные типы с моей библиотекой кажется особенно важной.
Один из способов - заставить людей создать подкласс «интерфейсного» класса. Для меня это больше похоже на 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
(целые числа не повторяются), поэтому где-то должна проводиться проверка типов - что, если я захочу сделать то же самое?
Этот вопрос будет открытым, но как лучше всего решить указанную выше проблему? Существуют ли какие-либо установленные передовые практики? Как, например, реализована итеративная «проверка типов», описанная выше?
Хотя AttributeError
работают нормально, ошибки TypeErrors
, вызываемые собственными функциями, обычно дают больше информации о том, как исправить ошибки. Возьмем, к примеру, следующее:
>>> ['a', 1].sort()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()
Я бы хотел, чтобы моя библиотека была максимально полезной.