__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):

Não adicione__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.

questionAnswers(2)

yourAnswerToTheQuestion