@PavelMos

Как в Python проверять, в каких скриптах какие ресурсы, импортируемые из других скриптов, используются?

Допустим, у меня есть набор программ, скриптов в py, и небольшой набор модуле (те же файлы py), в которых хранятся часто используемые функции, данные. Эти модули время от времени надо обновлять, данные, функции будут меняться. И сами данные, и названия (т.е. названия объектов).
Есть ли какие-то готовые средства для проверки, в каких моих скриптах используется такой-то объект из модуля ? Хорошо так же было бы его централизованно менять во всех скриптах. Например, был большой словарь top100, но теперь уже нужен словарь top200, и я хочу во всех файлах, где вызывался top100, заменить его на top200.
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ну вот тут ты столкнулся с проблемой изоляции изменений.
Обозначим код, который предоставляет какую-то услугу, сервисом, а код, который эту услугу использует - клиентом.
Тогда есть два типа изменений: изменение реализации сервиса и изменение интерфейса сервиса.

Первое изменение затрагивает сервис, но необязательно затрагивает клиента. Если клиент обращается к сервису таким же образом, получает результат в таком же виде, получает сведения об ошибках таким же способом, то с точки зрения клиента изменения не было. Пусть даже в реальности сервис переписали с нуля.
Пример: пусть у нас есть функция сортировки списка "на месте", т.е. изменяя этот список.
def sort_list(original: list):
Если раньше она сортировала список пузырьком, а потом мы её переписали на quicksort - с точки зрения кода, который эту функцию использует, ничего не изменится, кроме времени работы функции. Клиент все равно будет использовать функцию так:
some_list = [ ... ]
sort_list(some_list)


Второй тип изменений меняет интерфейс сервиса, т.е. то, как он взаимодействует с клиентом.
Продолжая пример, если мы решили, что теперь функция будет возвращать отсортированную копию списка, не трогая исходный список:
def sort_list(original: list) -> list:
Это изменение сломает клиентский код, так как ему теперь придётся использовать функцию так:
some_list = [ ... ]
some_list = sort_list(some_list)

Т.е. наше изменение сломало обратную совместимость: старый код не может работать с новыми версиями.

Если быть осторожным, то можно внести изменение в интерфейс, не сломав обратную совместимость. Например, если мы решили научить нашу функцию сортировать не только по возрастанию, но и по убыванию:
def sort_list(original: list, inverse: bool = False):

Тогда изначальный способ вызова sort_list(some_list) по прежнему будет работать. Мы расширили старый интерфейс, а не заменили его.

Так вот, к чему я всё это говорю: умные IDE, вроде PyCharm, могут находить случаи использования того или иного элемента в рамках одного проекта (!). Но эта возможность очень ограничена, так как всегда можно так запутать код, что никакая IDE не разберётся.
Поэтому лучше заранее продумывать, как клиентский код будет обращаться к услугам твоих сервисов, чтобы не пришлось переписывать интерфейс, а только реализацию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы