__decorated__ para decoradores python
A partir do 2.4 (2.6 para classes), o python permite decorar uma função com outra função:
def d(func): return func
@d
def test(first): pass
É um açúcar sintático conveniente. Você pode fazer todo tipo de coisas legais com decoradores sem fazer bagunça. No entanto, se você quiser descobrir a função original que foi decorada, precisará pular os bastidores (comoCls.method.__func__.__closure__[0].cell_contents
ou pior).
Eu me encontrei desejando uma maneira melhor e descobri que havia alguma discussão sobre python-dev sobre a adição de uma variável chamada__decorated__
para a [nova] função retornada pelo decorador. No entanto, parece que não foi a lugar nenhum.
Sendo uma pessoa aventureira, e tendo tido uma experiência bastante pesada em python por cerca de 4 anos, pensei em implementar__decorated__
na fonte do compilador python, apenas para ver como vai.
Para ser sincero, nunca mergulhei no C por baixo do capô, então minhas primeiras horas foram apenas tentando entender como o código C subjacente funciona. Então, primeiro,quais seriam os melhores recursos para entender o que eu teria que mudar / adicionar para__decorator__
?
Em segundo lugar, se um decorador retornar uma nova função,__decorated__
retornaria a função original decorada. No entanto, se o decorador retornar a função original, o que deve acontecer? Aqui estão três opções que eu poderia pensar (a terceira é a minha favorita):
__decorator__
.Adicionar, acrescentar__decorator__
mas defina-o como Nenhum.Adicionar, acrescentar__decorator__
e defina-o para a função original de qualquer maneira.Então, se acontecer,qual você acha que seria a melhor opção?
ATUALIZAR:
Alguémtrouxe à minha atenção um cenário que eu tinha perdido. O que acontece quando o decorador não retorna a função original nem a função que envolve o original? Nesse ponto, nada está mantendo uma referência à função original e ela será coletada como lixo. (ObrigadoPensamento estranho!)
Então, nesse caso, acho que ainda iria com a terceira opção. O objeto retornado pelo decorador obteria uma__decorated__
nome que faz referência à função original. Isso significaria que não seria coletado como lixo.
Parece-me estranho que a função de uma definição de classe desapareça completamente porque você a decorou. Na minha opinião, isso é ainda mais motivo para ter um__decorated__
atributo aplicado a todo decorador. No entanto, é mais provável que minha intuição esteja com defeito e que o comportamento atual seja o que a maioria das pessoas esperaria.Alguma ideia?
p.s. esta é uma extensão de uma versão anterior mais geralPergunta, questão Eu tinha. Eu também procurei mais informações sobre a primeira parte com umseparado postar.