Python: поиск глобальных классов в одном модульном файле - PullRequest
2 голосов
/ 11 мая 2011

У меня есть файл Python 2.x module.py, который выглядит следующим образом:

class A(object):
    KEYWORD = 'Class A'

class B(A):
    KEYWORD = 'Class B'

class C(object):
    pass

def list_class_keywords():
    for name in globals():
        print name, hasattr(name, 'KEYWORD')

if __name__ == '__main__':
    list_class_keywords()

В list_class_keywords() я перебираю все объекты этого файлового модуля и проверяю,Объект имеет атрибут KEYWORD.Очевидно, что это не работает, так как name является строкой.Как мне переписать list_classes, чтобы получить то, что я ищу?


Обновление: благодаря Игнасио за подсказку.Вот обновленный код:

def list_class_keywords():
    global_dict = globals()
    for name in global_dict:
        obj = global_dict[name]
        print name, hasattr(obj, 'KEYWORD')

Ответы [ 3 ]

3 голосов
/ 11 мая 2011

globals() - это словарь. Индексируйте это.

Но вы должны использовать декоратор для перечисления классов.

2 голосов
/ 11 мая 2011
class A(object):
    KEYWORD = 'Class A'

class B(A):
    KEYWORD = 'Class B'

class C(object):
    pass

def list_class_keywords():
    for name, obj in globals().items():
        print name, hasattr(obj, 'KEYWORD')

if __name__ == '__main__':
    list_class_keywords()    
1 голос
/ 11 мая 2011

Это немного глупо, но вы можете eval() строку, которая является именем, и она получит объект с таким именем.Если это класс, то он должен работать.

Тест:

>>>> class Object:
....     pass
.... 
>>>> eval("Object")
<class __main__.Object at 0x0000000102a62bc0>
>>>> 

ОБНОВЛЕНИЕ: Другой ответ гораздо лучше.

...