Если у вас есть опыт работы с Python, вы, должно быть, уже видели TypeError: «T» Объект не Callable
Отказ
В этой статье мы постараемся демистифицировать этот вид ошибок.
А Callable
это все, что можно назвать, из функции, к конструктору класса.
Например, Лен
вызывается, потому что мы можем написать Лен (объект)
.
Самый простой способ написать функцию или лямбда:
def foo(*args): pass bar = lambda *args: 0
Но здесь мы не будем охватывать эти вещи, поскольку они являются основными знаниями Python.
class Foo: def __call__(self, *args): print("hello world!") bar = Foo() # instanciating a Foo object, creating a callable bar() # calling it!
Мы создали базовый Callable, давая ему __call__
Метод, и мы можем проверить, является ли объект Callable (полезно при отладке) с помощью:
# homemade method to explain EAFP def is_callable(obj, *args, **kwargs, ***okwargs): try: obj(*args, **kwargs, ***okwargs) except TypeError as e: return 'object is not callable' not in str(e) return True # built-in way to check if an object is callable (thanks rhymes for pointing it out): using callable(obj) >>> callable(foo), callable(bar), callable(Foo), callable(Foo()), callable(3) (True, True, True, True, False)
Потому что мы не можем использовать Hasattr (Obj, '__call__')
, так как Python пропускает __getattribute__
и __getattr__
Когда Призыв что-то, таким образом, мы можем сделать только то, что называется Eafp. : Е до А Спросите прощение, чем разрешение.
Надеюсь, эта статья помогла вам, если у вас есть что-нибудь, чтобы добавить, не стесняйтесь оставить комментарий!
Оригинал: “https://dev.to/superfola/call-me-maybe-an-explanations-of-python-callables-4fmc”