8 svar
158 visningar
Solenskiner är nöjd med hjälpen
Solenskiner 87
Postad: 22 jun 2022 13:49

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!

CurtJ 1141
Postad: 22 jun 2022 14:15

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?

Solenskiner 87
Postad: 22 jun 2022 15:06

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...

Laguna Online 28413
Postad: 22 jun 2022 16:17

Vad gör raden @smartt?

CurtJ 1141
Postad: 22 jun 2022 19:33

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.

emilg 478
Postad: 22 jun 2022 21:40
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")

CurtJ 1141
Postad: 22 jun 2022 21:51

Nej du har rätt, func pekar på printer. Tack för påpekandet.

emilg 478
Postad: 22 jun 2022 22:10
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.

CurtJ 1141
Postad: 22 jun 2022 22:31

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å.

Svara Avbryt
Close