Мне нужно пометить подпрограммы как устаревшие, но, очевидно, нет стандартного декоратора библиотеки для устаревания. Мне известны рецепты этого и модуль предупреждений, но мой вопрос: почему нет стандартного декоратора библиотеки для этой (общей) задачи?
Дополнительный вопрос: есть ли вообще в стандартной библиотеке стандартные декораторы?
Ответы:
Вот фрагмент, модифицированный из тех, что цитирует Леандро:
Потому что в некоторых интерпретаторах первое открытое решение (без обработки фильтра) может привести к подавлению предупреждения.
источник
functools.wraps
а не задавать такие имя и документ?Вот еще одно решение:
Этот декоратор ( фактически фабрика декораторов ) позволяет вам указать причину . Также более полезно помочь разработчику диагностировать проблему, указав имя исходного файла и номер строки .
EDIT : этот код использует рекомендацию Zero: он заменяет
warnings.warn_explicit
строку наwarnings.warn(msg, category=DeprecationWarning, stacklevel=2)
, которая печатает сайт вызова функции, а не сайт определения функции. Это упрощает отладку.EDIT2 : эта версия позволяет разработчику указывать необязательное сообщение «причина».
Вы можете использовать этот декоратор для функций , методов и классов .
Вот простой пример:
Ты получишь:
EDIT3: этот декоратор теперь является частью устаревшей библиотеки:
Новый стабильный релиз v1.2.10 🎉
источник
warn_explicit
строку,warnings.warn(msg, category=DeprecationWarning, stacklevel=2)
которая печатает сайт вызова функции, а не сайт определения функции. Это упрощает отладку.Как подсказал мюон , вы можете установить
deprecation
пакет для этого.Монтаж
Пример использования
См. Http://deprecation.readthedocs.io/ для полной документации.
источник
Я предполагаю, что причина в том, что код Python не может обрабатываться статически (как это делается для компиляторов C ++), вы не можете получить предупреждение об использовании некоторых вещей до его фактического использования. Я не думаю, что это хорошая идея, чтобы спамить пользователю вашего скрипта кучей сообщений «Предупреждение: этот разработчик этого скрипта использует устаревший API».
Обновление: но вы можете создать декоратор, который преобразует исходную функцию в другую. Новая функция будет отмечать / проверять переключатель, сообщая, что эта функция уже была вызвана, и будет отображать сообщение только при включении переключателя. И / или при выходе он может распечатать список всех устаревших функций, используемых в программе.
источник
Вы можете создать файл utils
А затем импортируйте декоратор устаревания следующим образом:
источник
ОБНОВЛЕНИЕ: я думаю, что лучше, когда мы показываем DeprecationWarning только первый раз для каждой строки кода и когда мы можем отправить какое-то сообщение:
Результат:
Мы можем просто щелкнуть по пути предупреждения и перейти к строке в PyCharm.
источник
Дополнение к этому ответу Стивена Васкелларо :
Если вы используете Anaconda, сначала установите
deprecation
пакет:Затем вставьте следующее в верхнюю часть файла
См. Http://deprecation.readthedocs.io/ для полной документации.
источник