Страницы

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

понедельник, 18 марта 2019 г.

Можно ли в 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, необходимо отобразить экспортироемую пакетом информацию.


Ответ

К сожелению без запуска кода никак
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']

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

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