替代callable(),用于Python 3

Sop*_*hia 11 callable python-3.x

我查看了这个帖子,但有些概念高于我目前的水平.在Python 2.x中,callable()内置方法存在; 是否有一种简单的方法来检查是否可以使用Python 3调用某些内容?

joe*_*ker 40

它回来了.Python 3.2有callable(); 不再需要使用一种不太方便的替代品.


Len*_*bro 18

callable() 回到Python 3.2.

如果你需要使用Python 3.1(极不可能),那么除了检查__call__还有以下解决方案:

  • 2to3将a callable(x)变为isinstance(x, collections.Callable)

  • 六个用途

      any("__call__" in klass.__dict__ for klass in type(x).__mro__)
    
    Run Code Online (Sandbox Code Playgroud)

    即它__call__在基类中检查.这让我想起我应该问本杰明为什么.:)

最后你当然可以尝试:

try:
    x = x()
except TypeError:
    pass
Run Code Online (Sandbox Code Playgroud)

  • 辉煌.但尝试/除了建议是可怕的. (7认同)
  • 这是一个古老的对话,但我应该注意:如果``x``本身试图调用某些内容并且没有捕获它产生的TypeError异常会发生什么?然后你还没有确定``x``是不可调用的,而是``x``中的某个调用链引发了一个TypeError.细微不同,但不同. (4认同)
  • @LennartRegebro很抱歉花了太长时间,但我不同意.我的代码中只有很少的callables(__ call__只有几行代码,有几个db调用并且有时会更改对象状态).我可能不喜欢打电话给他们看看他们是否可以赎罪. (2认同)

Chi*_*chi 8

你可以hasattr(object_name, '__call__')改为做.与Python 2.x不同,它适用于所有可调用对象,包括类.

  • 在Python 2.x中,它适用于新式类,但不适用于旧式.但请记住,在(新式)类上调用的`__call__`是`type`(或类的元类),而不是类的. (2认同)