Не вызывается, потому что вы уже зарегистрировали непатчированную версию в системе событий.SQLAlchemy не читает значение в root.myapp.app.hook_fn
каждый раз, когда происходит событие, поэтому даже если вы позже установите root.myapp.app.hook_fn = some_other_function
(что и делает patch
), оно не имеет видимого эффекта.
Чтобы исправить это, нужно просто заставить ваше приложение читать значение каждый раз, когда происходит событие, путем введения уровня косвенности:
MyModel.register_hook(lambda: hook_fn())
Это использует способ, которым Python разрешает идентификаторы в замыкании,где изменение root.myapp.app.hook_fn
фактически меняет значение hook_fn
в замыкании.
Что касается вашего второго вопроса, не существует простого способа выяснить, что вам нужно исправить, потому что для того, чтобы исправить это напрямую, вам нужночтобы выяснить, где он хранится во внутренностях SQLAlchemy, и в зависимости от этого, даже в ваших тестах, он достаточно хрупок.