134 votes

Python vérifie les instances des classes

Existe-t-il un moyen de vérifier si un objet est une instance d'une classe ? Pas une instance d'une classe concrète, mais une instance de n'importe quelle classe.

Je peux vérifier qu'un objet n'est pas une classe, pas un module, pas un traceback, etc.

1voto

Existe-t-il un moyen de vérifier si un objet est une instance d'une classe ? Pas une instance d'une classe concrète, mais une instance de n'importe quelle classe.

Je peux vérifier qu'un objet n'est pas une classe, pas un module, pas une traceback etc., mais je suis intéressé par une solution simple.

Une approche, comme celle que vous décrivez dans votre question, est un processus d'exclusion, vérifier si ce n'est pas ce que vous voulez. Nous vérifions si c'est une classe, un module, un traceback, une exception ou une fonction. Si c'est le cas, alors ce n'est pas une instance de classe. Sinon, nous retournons True, ce qui peut être utile dans certains cas, et nous nous constituons une bibliothèque de petites aides en cours de route.

Voici un code qui définit un ensemble de vérificateurs de type et qui les combine tous pour exclure diverses choses dont nous ne nous soucions pas pour ce problème.

from types import (
    BuiltinFunctionType,
    BuiltinMethodType,
    FunctionType,
    MethodType,
    LambdaType,
    ModuleType,
    TracebackType,
)
from functools import partial
from toolz import curry
import inspect

def isfunction(variable: any) -> bool:
    return isinstance(
        variable,
        (
            BuiltinFunctionType,
            BuiltinMethodType,
            FunctionType,
            MethodType,
            LambdaType,
            partial,
            curry
        ),
    )

isclass = inspect.isclass

def ismodule(variable: any) -> bool:
   return isinstance(variable, ModuleType)

def isexception(variable: any) -> bool:
    return isinstance(variable, Exception)

def istraceback(variable: any) -> bool:
    return isinstance(variable, TracebackType)

def isclassinstance(x: any) -> bool:
    if isfunction(x) or isclass(x) or ismodule(x) or istraceback(x) or isexception(x):
        return False
    return True

gardez à l'esprit que, d'un point de vue très abstrait, tout est une chose, même les catégories de choses ou les fonctions ... mais d'un point de vue pratique, cela pourrait aider à éviter de confondre MyClass avec my_class_instance (la communauté python fait aussi cela de manière informelle avec PascalCase vs snake_case)

nous pourrions améliorer cela

0voto

Ben Hoff Points 418

J'ai eu à faire face à quelque chose de similaire récemment.

import inspect

class A:
    pass

def func():
    pass

instance_a = A()

def is_object(obj):
     return inspect.isclass(type(obj)) and not type(obj) == type

is_object(A)          # False
is_object(func)       # False
is_object(instance_a) # True

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X