type define argument python class types module typechecking

define - python static typing



Python: verifica si el objeto es una instancia de alguna clase de un módulo determinado (2)

Necesita una forma de verificar si un objeto es una instancia de cualquier clase en algún módulo en particular.

Sé que puedo hacerlo importando explícitamente cada clase de ese módulo y comprobando con una tupla:

from my_module import ClassOne, ClassTwo >>> isinstance(my_obj, (ClassOne, ClassTwo)) True

Pero en realidad, el módulo del que estoy importando tiene un TONELADO de clases en él, y parece innecesariamente detallado para importarlos todos explícitamente, usarlos para construir una gran tupla y escribir check contra él. He intentado algunas cosas para evitar esto:

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

¿Hay una manera de escribir check contra TODAS las clases en my_module, sin nombrarlas explícitamente en una tupla?

Información de fondo opcional:
Puede que esté pasando por alto una mejor manera de abordar mi problema: si se está preguntando, esta es la situación:

Estamos exportando datos desde una aplicación de Google App Engine a una aplicación que hemos alojado en Rackspace. Estamos serializando los datos con pickle y luego enviándolos a nuestro servidor Rackspace con solicitudes HTTP.

Algunos de los datos en la base de datos de Google App Engine son de tipos de datos específicos de GAE, importados de google.appengine.api.datastore_types. Si alguno de estos tipos de datos se transfiere a nuestro servidor de Rackspace, generará un error de eliminación, ya que nuestra aplicación de Rackspace no tiene las bibliotecas GAE requeridas. Entonces, al salir de GAE, estoy revisando para ver si alguno de los objetos salientes tiene un tipo de google.appengine.api.datastore_types. Si lo hacen, los convierto a un tipo de datos integrado o borro el campo del objeto.


He utilizado la solución simple @mgilson:

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

y notó que si tiene un árbol de módulos y desea asegurarse de que proviene del módulo base, debe hacer lo siguiente:

from somewhere import module if getattr(obj, ''__module__'', None).split(''.'')[0] == module.__name__: # obj is from module.

Pero si su object es de una función incorporada, se producirá una excepción, así que yo:

from somewhere import module module_tree = getattr(obj, ''__module__'', None) parent = module_tree.split(''.'')[0] if module_tree else None if parent == module.__name__: # obj is from module.


Puede usar inspect.getmembers para obtener todas las clases en su módulo:

inspect.getmembers(my_module,inspect.isclass)

Esto devolverá una lista de pares nombre-clase. Solo quieres las clases:

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

Una cosa que logré pasar por alto cuando escribí inicialmente esta respuesta es la capacidad de verificar el atributo __module__ una clase. Es posible que pueda salir y comprobar si el __module__ es lo que espera que sea:

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

Es probable que esto sea más barato que la comprobación de isinstance frente a una gran lista de nombres de clase.