Философия использования различных объектов в программе Python называется утка, набирая -если она выглядит как утка, шарлатанцы, как утка, и ходит как утка, это утка. Объекты сгруппированы не по типу их типа, а в том, что они способны делать, и это даже распространяется на функции. При написании программы Python вы всегда должны знать, что могут делать все ваши объекты и использовать их без проверки.
Например, я мог бы определить функцию
def add_three(a, b c):
return a + b + c
и означает для его использования с тремя поплавками. Но, не проверяя это, у меня есть гораздо более полезная функция - я могу использовать ее с ints, с decimal.Decimals или с фракциями. Например, фракции.
То же самое касается наличия функции. Если я знаю, что у меня есть функция, и я хочу назвать ее, я должен просто позвонить ей. Возможно, что у меня есть функция, и, возможно, у меня есть другой вызываемый (например, связанный метод или экземпляр произвольного класса, который определяет __call__
), который может быть таким же хорошим. Не проверяя ничего, я делаю свой код в состоянии справиться с широким кругом обстоятельств, о которых я, возможно, даже не думал заранее.
В случае с вызывающими, я могу довольно уверенно определить, есть ли у меня один или нет, но ради простоты моего кода я не хочу этого делать. Если кто-то передает что-то, что не подлежит вызову, вы получите сообщение об ошибке, когда вы его вызываете. Если я пишу код, который принимает параметр, который может быть вызываемым или нет, и я делаю разные вещи в зависимости от него, похоже, что я должен улучшить свой API, определив две функции для этих двух разных вещей.
Если у вас есть способ обработать случай, когда вызывающий передал что-то, что не является функциональным (и это было не просто результатом безумного API), правильным решением было бы поймать TypeError
, который возникает при попытке вызвать то, что нельзя назвать. В общем, лучше попытаться что-то сделать и восстановить, если это не удастся, а не проверять заранее. (Вспомните клише: «Проще просить прощения, чем разрешение».) Проверка загодя может привести к неожиданным проблемам, основанным на тонких ошибках в логике и может привести к условиям гонки.
Почему, по-вашему, вам нужно иметь дело с typecheck?
Вы хотите, чтобы это возвращало true для классов, так как они могут быть вызваны? – Javier
Лучшим решением является прекращение желания сделать это. –
Что мешает вам читать код? –