decorators
Hej! jag har jättesvårt att förstå decorators :(
Koden nedan ( Bild 1) resulterar i att inget printas.
Bild 1:
MEN om jag gör på följande sätt:
Så printas det på terminalen... varför måste jag assigna print_msg funktionen till en variabel? Dvs. varför fungerar bild2 men inte bild 1? och när jag retunerar en funktion, invokar jag då funktionen ( dvs. i line 7 i bild 2, invokar den printer funktionen? )
Tacksam för svar!
Din print_msg skriver ju inte ut något utan skapar en utskriftsfunktion och returnerar den. Om du bara anropar print_msg och inte gör något med resultatet av anropet så får du ingen utskrift utan den utskriftsfunktion som skapas hamnar i tomma intet.
I din bild 2 gör du just det. Du tar hand om resultatet av anropet, stoppar in det i en variabel func och anropar funktionen med func() som i sin tur anropar funktionen printer.
Blev det klarare?
Tack!
vet du vad felet är i denna koden? Errorn jag får är:
RecursionError: maximum recursion depth exceeded while calling a Python object
och min kommand line repeterar raden:
Din vattenflaska är gul...
Vad gör raden @smartt?
Du skapar en decorator smartt som ska decorera (kapsla in) do_not_modify och när du anropar din metod så anropas decoratorns metod inner (som har returnerats). Inner() anropar i sin tur do_not_modify och då blir det en fnurra på tråden. Den anropar den anropande metoden och det kallas rekursivt anrop, vilket är det du får varning för.
Byt anropet do_not_modify() i din inner() till func() så borde det fungera bättre.
CurtJ skrev:I din bild 2 gör du just det. Du tar hand om resultatet av anropet, stoppar in det i en variabel func och anropar funktionen med func() som i sin tur anropar funktionen printer.
Semantisk fråga kanske, men är det verkligen någon skillnad på func och printer i exempel 2? (reagerade på "som i sin tur")
Nej du har rätt, func pekar på printer. Tack för påpekandet.
CurtJ skrev:Nej du har rätt, func pekar på printer. Tack för påpekandet.
👍
Jag menar till och med att de ÄR samma sak (kan ha fel dock). På samma sätt som när du skriver l = [1,2,3] och sedan k = l. Spelar ingen roll om du ändrar i k eller l, det är i samma lista du ändrar.
Typ så här:
Som jag förstår det, finns det inga pekare till funktioner i Python.
Jag uttrycker mig slarvigt, func och printer som är två instanser av namn (namn i pythons symboltabell eller variabler i dagligt tal) som refererar till samma objekt. Det är referensen jag kallar pekare vilken, som du rätteligen påpekar, inte är explicit i språket Python, där används begreppet id men id är vad jag i dagligt tal kallar referens, dvs dina hex-tal (0x7f...) i exemplet ovan.
Att det är två olika namn ger sig av att du t ex kan tilldela g ett nytt värde utan att f ändras.
Funktioner i Python är objekt precis som allt annat och kan hanteras som det, t ex skickas som parametrar, returneras eller, som du visar, tilldelas variabler.
Det är bra att diskutera sånt här för det gör det enklare att förstå.