По состоянию на 20 января 2019 г. PEP 544 имеет статус Draft
. Насколько я понимаю, он еще не реализован в CPython.
Я происхожу больше из стороны SW, что сторона DB, если Вы создаете ряд ДАО (Объекты доступа к данным), что Вы используете для своего взаимодействия с базой данных. Я затем вставил бы контрольную функциональность в соответствующие функции в ДАО, которые нужно запоздать.
Триггерное решение для базы данных также выполнимо, оно зависит, где Вам нравится помещать Вашу функциональность в DB или в коде
Существует много ORM (Возразите реляционному Отображению), инструменты там, которые создают уровень DAO для Вас.
Триггеры базы данных являются предпочтительным способом пойти сюда, если Вы можете.
Однако недавно я должен был сделать это в клиентском коде, и я закончил тем, что писал класс, который создал глубокое (значение) копия объекта, когда это было открыто для редактирования, выдержал сравнение, два объекта в экономят время (использующий ToString () только) и записали любые изменения в контрольной таблице.
Править: У меня был [Контрольный] атрибут на каждом свойстве, я хотел полагать, что auditable и используемое отражение находит их, делая метод неопределенным к объектам контролируемый.
Я не знаю, будет ли это соответствовать беспрепятственно Вашему ORM, но я использовал проектирование баз данных Момента времени для приложения ERP, и действительно рекомендуйте это. Вы автоматически получаете Историю и Аудит от этой архитектуры, а также другие преимущества.
Мы реализовали аналогичное решение, с помощью AOP (aspectJ реализация). Используя этот конкретный могут быть получены точки, и могут быть выполнены определенные операции.
Это может быть включено и включено прочь, когда нам нравится.
Если бы Вы действительно хотите сделать это в слое приложения, я предложил бы это.
Надежда это помогает..
Я знаю, что это не отвечает на Ваш вопрос, но для записи, я предпочитаю обрабатывать этот тип аудита логики в базе данных.
Я выполнил, это В спящем режиме (другой ORM) использование Перехватчика для Сессии. Тем путем контрольный код является отдельным от Вашего кода.