Come posso ottenere un elenco di tutte le classi nel modulo corrente in Python?



Answers

Che dire

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

?

Question

Ho visto un sacco di esempi di persone che estraevano tutte le classi da un modulo, di solito qualcosa di simile:

# foo.py
class Foo:
    pass

# test.py
import inspect
import foo

for name, obj in inspect.getmembers(foo):
    if inspect.isclass(obj):
        print obj

Eccezionale.

Ma non riesco a scoprire come ottenere tutte le classi dal modulo corrente .

# 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()

Questo è probabilmente qualcosa di ovvio, ma non sono stato in grado di trovare nulla. Qualcuno mi può aiutare?




Un'altra soluzione che funziona in Python 2 e 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()



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

Si noti che il modulo del browser di classe Python di stdlib utilizza l'analisi delle origini statiche, quindi funziona solo per i moduli che sono supportati da un vero file .py .






Links