Python рекомендует печатать на утках или «проще просить прощения, чем разрешения» (EAFP), что означает, что вы должны полагать, что ваши аргументы верны, а если нет, обрабатывать ситуацию надлежащим образом.
Мы предполагаем, что «если он ходит и говорит как утка, значит, это утка». Смотрите здесь:
class Duck:
def quack(self):
return 'quack!'
class Person:
def quack(self):
return 'Hey there!'
d = Duck()
p = Person()
def make_it_quack(duck):
return duck.quack()
print(make_it_quack(d))
print(make_it_quack(p))
Как видите, оба типа работают. Это намеренное поведение. Если вы столкнетесь с чем-то, что не определяет этот метод, вы получите AttributeError
, как и ожидалось. Чтобы обойти это, используйте обработку исключений:
try:
print(make_it_quack(d))
print(make_it_quack(p))
print(make_it_quack('hello world'))
except AttributeError:
print('object must have a "quack" method')
Сказав все это, я лично не всегда придерживаюсь этого. Например, если я не могу гарантировать типы моих объектов, я буду использовать такие вещи, как if isinstance(x, Y)
, чтобы правильно направлять код. Если нет, то он возвращается к try except
.
Вам решать, какой из них сделает ваш код чище и соответствует ситуации. Есть рекомендации по этому поводу, такие как «всегда использовать попытку / за исключением ошибок ввода-вывода» (есть причина этого).