Ну вот тут ты столкнулся с проблемой изоляции изменений.
Обозначим код, который предоставляет какую-то услугу, сервисом, а код, который эту услугу использует - клиентом.
Тогда есть два типа изменений: изменение реализации сервиса и изменение интерфейса сервиса.
Первое изменение затрагивает сервис, но необязательно затрагивает клиента. Если клиент обращается к сервису таким же образом, получает результат в таком же виде, получает сведения об ошибках таким же способом, то с точки зрения клиента изменения не было. Пусть даже в реальности сервис переписали с нуля.
Пример: пусть у нас есть функция сортировки списка "на месте", т.е. изменяя этот список.
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 не разберётся.
Поэтому лучше заранее продумывать, как клиентский код будет обращаться к услугам твоих сервисов, чтобы не пришлось переписывать интерфейс, а только реализацию.