En Python 2.6 ou mieux, l'approche préconisée est:
import collections
def is_func(instance, func):
return isinstance(getattr(instance, func, None), collections.Callable)
Les nouvelles ABC (classes de base abstraites) dans le module collections
sont la façon correcte, en Python 2.6+ et 3.any, d'effectuer ce genre de "vérifications de type de type canard" - beaucoup plus élégant, unform, et F Plus résistant que les anciennes approches telles que callable
intégré, operator.isCallable
, ou en vérifiant la présence de méthodes spéciales spécifiques telles que __call__
. Puisque isinstance
peut maintenant être surchargé, laissez-le à l'ABC pour le surcharger et effectuer les vérifications en encapsulant toutes les approches de niveau inférieur qui fonctionnent le mieux! L'élégance et les avantages de la nouvelle approche sont tels que, si vous avez besoin de rendre votre code portable entre des versions plus anciennes et plus récentes de Python, je recommande d'encapsuler les "tests de dactylographie" dont vous avez besoin dans un module qui peut définir sa fonction en fonction du sys.version
- en utilisant isinstance(x, collections.Y)
en 2.6 ou mieux, et des approches plus anciennes telles que hasattr(x, '__somespecialmethod__')
ou callable(x)
en 2.5 ou pire.
Plus important encore, et plus généralement, ne pas pollue votre nouveau code d'application ligne principale avec les anciens, les moyens inférieurs - si les exigences de rétro-portabilité forcer votre système dans son ensemble d'avoir une « ordures » (pour continuez à fonctionner sur les vieilles versions de Python), au moins cachez-la décemment dans son propre "compartiment" (où un jour vous pourrez facilement l'emporter si les contraintes de déploiement de votre application le permettent!).
quelle est la différence entre callable (fonction) et hasattr (fonction, '__ call__')? –
'callable' n'existe pas dans py3k – SilentGhost