Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Можно ли в Python отследить использование класса из модуля?

#python


Возможен ли способ выяснить - был ли проимпортирован класс\атрибут\функция из текущего
файла в другом файле текущего проекта?
Например, есть код:

file01.py
    class Foo1():
        pass

    class Foo2():
        pass


file02.py
    import file01
    class Bar1():
        f1 = file01.Foo1()
        f2 = file01.Foo2()

    class Bar2():
        pass


Для задачи есть функция:  

def inspection(module):
    for i in dir(module):
        
        print('class {0} used in {1}'.format(class_name, module_name))


Что при выполнении:
inspection(file01)
Выдаст результат типа:

class Foo1 used in: file02
class Foo2 used in: None


Подобный функционал был бы полезен для написания docstring для файлов __init__.py.
В котором, согласно PEP257, необходимо отобразить экспортироемую пакетом информацию.
    


Ответы

Ответ 1



К сожелению без запуска кода никак import sys def watch_uses(cls, log): class MetaTemp(type(cls)): def __call__(cls, *args, **kwargs): call_frame = sys._getframe(1) log.append('{}:{}'.format( call_frame.f_locals['__file__'], call_frame.f_lineno )) return super().__call__(*args, **kwargs) class new_cls(cls, metaclass=MetaTemp): pass return new_cls class C: pass uses_C = [] C = watch_uses(C, uses_C) #здесь вам нужно как-то происпользовать C c = C() c = C() print(uses_C) #может вывести: ['./t.py:27', './t.py:28']

Комментариев нет:

Отправить комментарий