python reflection inspect

inspect python 3



¿Cómo puedo obtener una lista de todas las clases dentro del módulo actual en Python? (9)

Creo que puedes hacer algo como esto.

class custom(object): __custom__ = True class Alpha(custom): something = 3 def GetClasses(): return [x for x in globals() if hasattr(globals()[str(x)], ''__custom__'')] print(GetClasses())`

si necesitas clases propias

He visto muchos ejemplos de personas que extraen todas las clases de un módulo, generalmente algo como:

# foo.py class Foo: pass # test.py import inspect import foo for name, obj in inspect.getmembers(foo): if inspect.isclass(obj): print obj

Increíble.

Pero no puedo averiguar cómo obtener todas las clases del módulo actual .

# foo.py import inspect class Foo: pass def print_classes(): for name, obj in inspect.getmembers(???): # what do I do here? if inspect.isclass(obj): print obj # test.py import foo foo.print_classes()

Probablemente sea algo realmente obvio, pero no he podido encontrar nada. ¿Puede alguien ayudarme?


Esta es la línea que utilizo para obtener todas las clases que se han definido en el módulo actual (es decir, no importadas). Es un poco largo según PEP-8 pero puedes cambiarlo como mejor te parezca.

import sys import inspect classes = [name for name, obj in inspect.getmembers(sys.modules[__name__], inspect.isclass) if obj.__module__ is __name__]

Esto le da una lista de los nombres de clase. Si quiere que los objetos de la clase en sí mismos, simplemente manténgalos obj.

classes = [obj for name, obj in inspect.getmembers(sys.modules[__name__], inspect.isclass) if obj.__module__ is __name__]

Esto ha sido más útil en mi experiencia.


No sé si hay una manera "adecuada" de hacerlo, pero su fragmento está en el camino correcto: simplemente agregue import foo a foo.py, inspect.getmembers(foo) y debería funcionar bien.


Otra solución que funciona en Python 2 y 3:

#foo.py import sys class Foo(object): pass def print_classes(): current_module = sys.modules[__name__] for key in dir(current_module): if isinstance( getattr(current_module, key), type ): print(key) # test.py import foo foo.print_classes()


Prueba esto:

import sys current_module = sys.modules[__name__]

En su contexto:

import sys, inspect def print_classes(): for name, obj in inspect.getmembers(sys.modules[__name__]): if inspect.isclass(obj): print(obj)

Y aún mejor:

clsmembers = inspect.getmembers(sys.modules[__name__], inspect.isclass)

Porque inspect.getmembers() toma un predicado.


Pude obtener todo lo que necesitaba desde el dir incorporado más getattr .

# Works on pretty much everything, but be mindful that # you get lists of strings back print dir(myproject) print dir(myproject.mymodule) print dir(myproject.mymodule.myfile) print dir(myproject.mymodule.myfile.myclass) # But, the string names can be resolved with getattr, (as seen below)

Aunque, sale como una bola de pelo:

def list_supported_platforms(): """ List supported platforms (to match sys.platform) @Retirms: list str: platform names """ return list(itertools.chain( *list( # Get the class''s constant getattr( # Get the module''s first class, which we wrote getattr( # Get the module getattr(platforms, item), dir( getattr(platforms, item) )[0] ), ''SYS_PLATFORMS'' ) # For each include in platforms/__init__.py for item in dir(platforms) # Ignore magic, ourselves (index.py) and a base class. if not item.startswith(''__'') and item not in [''index'', ''base''] ) ))


Qué pasa

g = globals().copy() for name, obj in g.iteritems():

?


Si desea tener todas las clases, que pertenecen al módulo actual, puede usar esto:

import sys, inspect def print_classes(): is_class_member = lambda member: inspect.isclass(member) and member.__module__ == __name__ clsmembers = inspect.getmembers(sys.modules[__name__], is_class_member)

Si usa la respuesta de Nadia y estaba importando otras clases en su módulo, esas clases también se importarán.

Por eso es que el member.__module__ == __name__ se agrega al predicado usado en is_class_member . Esta declaración comprueba que la clase realmente pertenece al módulo.

Un predicado es una función (llamable), que devuelve un valor booleano.


import pyclbr print(pyclbr.readmodule(__name__).keys())

Tenga en cuenta que el módulo de navegador de clase Python de stdlib utiliza un análisis de fuente estática, por lo que solo funciona para módulos respaldados por un archivo .py real.