Python-vérifier si l'objet est une instance d'une classe d'un certain module

Besoin d'un moyen de vérifier si un objet est une instance de classe dans certains module particulier.

je sais que je peux le faire explicitement à l'importation de chaque classe, à partir de ce module et de vérification avec un n-uplet:

from my_module import ClassOne, ClassTwo

>>> isinstance(my_obj, (ClassOne, ClassTwo))
True

mais en réalité, le module que j'importe à partir a une tonne de classes dedans, et semble inutilement verbeux pour les importer tous explicitement, les utiliser pour construire un énorme tuple, et taper vérifier contre elle. J'en ai essayé quelques choses à éviter ceci:

import my_module

# Test my_obj against the module itself
>>> isinstance(my_obj, my_module)
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

# Try to test against a wildcard attribute on my_module
>>> isinstance(my_obj, my_module.*)
SyntaxError: invalid syntax

#Try to build a tuple of clases with iteration to check against
>>> for klass in my_module:
TypeError: 'module' object is not iterable

y a-t-il un moyen de vérifier le type de toutes les classes de my_module, sans les nommer explicitement dans un tuple?

Option Des Informations De Base:

J'ai peut être oublié une meilleure approche de mon problème, si vous vous demandez, voici la situation:

nous exportons des données d'une application Google App Engine app vers une application hébergée sur Rackspace. Nous sérialisons les données avec pickle et ensuite l'envoyer vers notre serveur Rackspace avec des requêtes HTTP.

certaines données de la base de données de Google App Engine sont des types de données spécifiques à GAE, importées de google.appengine.API.datastore_types. Si l'un de ces types de données va à travers le fil à notre serveur Rackspace, ils soulèveront une erreur depickling, parce que notre application Rackspace n'a pas les bibliothèques GAE nécessaires. Donc, en sortant de GAE, je vérifie si l'un des objets sortants a un type de Google.appengine.API.datastore_types. S'ils le font, je les convertis en un type de données intégré ou j'efface le champ de l'objet.

20
demandé sur Clay Wardell 2013-01-29 00:39:26

1 réponses

Vous pouvez utiliser inspect.getmembers pour obtenir toutes les classes de votre module:

inspect.getmembers(my_module,inspect.isclass)

vous obtiendrez une liste de paires nom-classe. Vous voulez juste les classes:

my_module_classes = tuple(x[1] for x in inspect.getmembers(my_module,inspect.isclass))

une chose que j'ai réussi à oublier quand j'ai écrit cette réponse au départ est la capacité de vérifier les __module__ l'attribut. Vous pourriez être en mesure d'obtenir à vérifier si le __module__ est ce que vous vous attendez à être:

from somewhere import module

if getattr(obj, '__module__', None) == module.__name__:
    # obj is from module.

il est probable que moins cher que isinstance vérification par rapport à une grande liste de noms de classe.

12
répondu mgilson 2017-02-24 19:51:13