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