Preciso marcar rotinas como obsoletas, mas aparentemente não há decorador de biblioteca padrão para obsoleta. Estou ciente das receitas para ele e o módulo de avisos, mas minha pergunta é: por que não existe um decorador de biblioteca padrão para essa tarefa (comum)?
Pergunta adicional: existem decoradores padrão na biblioteca padrão?
Respostas:
Aqui está um trecho modificado daqueles citados por Leandro:
Como em alguns intérpretes, a primeira solução exposta (sem manuseio de filtro) pode resultar em uma supressão de aviso.
fonte
functools.wraps
vez de definir o nome e o documento assim?Aqui está outra solução:
Este decorador (uma fábrica de decoradores de fato) permite que você dê uma mensagem de razão . Também é mais útil ajudar o desenvolvedor a diagnosticar o problema, fornecendo o nome do arquivo de origem e o número da linha .
EDIT : este código usa a recomendação de Zero: ele substitui a
warnings.warn_explicit
linha porwarnings.warn(msg, category=DeprecationWarning, stacklevel=2)
, que imprime o site de chamada de função em vez do site de definição de função. Isso facilita a depuração.EDIT2 : Esta versão permite que o desenvolvedor especifique uma mensagem "motivo" opcional.
Você pode usar este decorador para funções , métodos e classes .
Aqui está um exemplo simples:
Você terá:
EDIT3: Este decorador agora faz parte da biblioteca Reprovada:
Nova versão estável v1.2.10 🎉
fonte
warn_explicit
linha pelawarnings.warn(msg, category=DeprecationWarning, stacklevel=2)
qual imprime o site de chamada de função, em vez do site de definição de função. Isso facilita a depuração.Como o muon sugeriu , você pode instalar o
deprecation
pacote para isso.Instalação
Exemplo de uso
Consulte http://deprecation.readthedocs.io/ para obter a documentação completa.
fonte
Eu acho que o motivo é que o código Python não pode ser processado estaticamente (como foi feito para compiladores C ++), você não pode receber um aviso sobre o uso de algumas coisas antes de realmente usá-lo. Não acho que seja uma boa ideia enviar spam ao usuário do seu script com várias mensagens "Aviso: este desenvolvedor deste script está usando a API obsoleta".
Atualização: mas você pode criar um decorador que transformará a função original em outra. A nova função marcará / verificará a chave informando que essa função já foi chamada e mostrará mensagem apenas ao colocar a chave no estado ligado. E / ou na saída, pode imprimir uma lista de todas as funções obsoletas usadas no programa.
fonte
Você pode criar um arquivo utils
E importe o decorador de descontinuação da seguinte maneira:
fonte
UPDATE: Eu acho que é melhor quando mostramos o DeprecationWarning apenas pela primeira vez para cada linha de código e quando podemos enviar alguma mensagem:
Resultado:
Podemos apenas clicar no caminho de aviso e ir para a linha em PyCharm.
fonte
Aumentando esta resposta por Steven Vascellaro :
Se você usa o Anaconda, primeiro instale o
deprecation
pacote:Em seguida, cole o seguinte na parte superior do arquivo
Consulte http://deprecation.readthedocs.io/ para obter a documentação completa.
fonte