Я обычно хочу, чтобы мой код был как можно более общим. В настоящее время я пишу простую библиотеку и имею возможность использовать разные типы с моей библиотекой, на этот раз это очень важно.
Один из способов - заставить людей подклассифицировать класс "интерфейс". Для меня это больше похоже на 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 tail
try:
obj.wag_tail()
except AttributeError:
# handle this error as well
Должен ли я просто пропустить обработку ошибок и ожидать, что люди будут использовать объекты только с помощью необходимых методов? Если я делаю что-то глупое, как [x**2 for x in 1234]
, я действительно получаю TypeError
, а не AttributeError
(ints не являются итерабельными), поэтому там должна быть какая-то проверка типа где-то - что делать, если я хочу сделать то же самое?
Этот вопрос будет отчасти открытым, но каков наилучший способ справиться с вышеуказанной проблемой чистым способом? Существуют ли какие-либо установленные передовые методы? Как, например, реализована итеративная "проверка типов" выше?
Изменить
Пока AttributeError
в порядке, TypeErrors
, созданный встроенными функциями, обычно дает больше информации о том, как решить ошибки. Возьмите это, например:
>>> ['a', 1].sort()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()
Я хочу, чтобы моя библиотека была как можно более полезной.