Lokala (för en funktion) statiska variabler i Python 3? Hur?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Lokala (för en funktion) statiska variabler i Python 3? Hur?

Inlägg av lillahuset »

Om man vill skriva en statemaskin i C kan man tex göra såhär:

Kod: Markera allt

void statemachine(void)
{
  static int state;

  switch (state) {
  case 0:
    state++;
    break;

  case 1:
    state++;
    break;

  case 2:
    state = 0;
    break;
  }

} /* statemachine */
Men hur gör man i Python 3?

De statemaskiner jag skrivit så långt har statevariabeln som en global variabel i modulen och det känns fel.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av johano »

Allt i Python är objekt, så även funktioner. Så tilldela helt enkelt en variabel som en "medlem" till funktionen:

Kod: Markera allt


def statemachine():
   
   if statemachine.state == 0:
      statemachine.state += 1

   elif statemachine.state == 1:
      statemachine.state += 1

   elif statemachine.state == 2:
      statemachine.state = 0

statemachine.state = 0

/j
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av lillahuset »

Stort tack! :D
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av johano »

Hittade en liten decorator på nätet, då kan du snygga till deklarationen med ett attribut istället:

Kod: Markera allt

def static_var(varname, value):
    def decorate(func):
        setattr(func, varname, value)
        return func
    return decorate
Då kan du istället skriva såhär vilket ser lite snyggare ut i mina ögon:

Kod: Markera allt

@static_var(state=0)
def statemachine():
  statemachine.state += 1
  ...

Python är kul!

/j
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av lillahuset »

Python är kul!
Nja, eftersom jag är en grinig gammal C-gubbe vill jag inte ha en massa lull-lull. :)
Assembler någon? Eller FORTH? 8)
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av Icecap »

Jag har gjort saker för PC i Python - och föredrar fortfarande definitivt C.
Är nog en gammal grinig gubbe jag med.

Gör en hel del i den gamla Borland C Builder och trivs med det.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av johano »

Jag är också en grinig gammal gubbe och har ibland svårt att imponeras över nya språk/ramverk, men just Python hade jag väldigt lätt att ta till mig - kanske just för att jag _hade_ C/C++ i bagaget :-)
Och, jag hackar fortfarande C/C++, det ena utesluter ju inte det andra, vart språk är bra på sitt (utom Php som suger på allt)

/j
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av lillahuset »

Jag tackar johano för en väl fungerande lösning på mitt problem.

Men, det gör lite ont att variablerna är åtkomliga från kod utanför funktionen. Jag trodde jag skulle vänja mig men jag är troligen alltför präglad av mitt liv med C.
Finns det något som beter sig mer som en static i C? Dvs, behåller värdet mellan anrop av funktionen, osynlig utanför funktionen och gärna garanterat ha ett visst värde vid start.
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av baron3d »

Borland Builder är riktigt bra !
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av lillahuset »

Que?
guckrum
Inlägg: 1669
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av guckrum »

Jag är också en grinig gubbe som gärna kodar 8-bitars assembler, eller skriver VHDL för den delen, eller ritar kisel för hand, men faktum är att Python ger en sådan särdeles hävstång att det är synd att inte ta del av det.

För mig känns det naturligt att ha en statemachine som ett objekt innehållande state och metoder för att manupulera statet mm. Kanske en grund:

Kod: Markera allt

class StateMachine:
    def __init__(self, start_value):
        self.val = start_value
    def increase(self, val):
        self.val += val
    def show_val(self):
        print(self.val)

x = StateMachine(100)
y = StateMachine(200)
x.increase(5)
x.show_val()
y.show_val()
Två unika maskiner instansieras och programmet kommer att printa värdena 105 och 200.

Och ja, php suger på allt.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av lillahuset »

Ja VHDL var kul men det var länge sedan. Vi gjorde en bunt VME-kort med FPGA på för signalbehandling i slutet av åttiotalet och början av nittiotalet. Ett kort var speciellt minnesvärt, footprinten i CAD-systemet stämde väldigt dåligt med kretsen. Jag minns inte om det var kretsen eller footprinten som hade pinne 1 i hörnet men den andra mitt på ena sidan. Stackarn som caddade skämdes som en hund.
Tyvärr har jag inte lyckats passera tröskeln i Python, jag minns hur det var när jag passerade tröskeln i C, det var en underbar känsla. Samma med tröskeln i FORTH men där har jag halkat tillbaks till nybörjarstadiet eftersom "ingen" är intresserad av FORTH och det därmed är en ganska kass födkrok. C och assembler däremot verkar ha kommersiell potential. Och Python. Och en massa annan xxxxxx.

Din klass för en statemaskin är elegant men den saknar egenskapen att ha privata variabler. Visst, jag kanske är både nojig och fånig men jag gillar konceptet med privata variabler. :)
guckrum
Inlägg: 1669
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av guckrum »

Din klass för en statemaskin är elegant men den saknar egenskapen att ha privata variabler. Visst, jag kanske är både nojig och fånig men jag gillar konceptet med privata variabler. :)
Ingenting är privat i Python. Det är bra och dåligt.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av lillahuset »

Luktar klassisk BASIC lång väg. :(
guckrum
Inlägg: 1669
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Lokala (för en funktion) statiska variabler i Python 3?

Inlägg av guckrum »

Nä nu tar du väl ändå i :D Men min reaktion var liknande när jag insåg detta. Jag kan inte prata mig ur det, för det är en härlig känsla att isolera saker från varandra, men erfarenhetsmässigt har det visat sig att det är direkt ovanligt att det går snett på grund av bristande isolation. För mig och de projekt jag jobbat med.

En sak du kan göra är att låta alla privata saker ha ett namn som börjar med två underscore, tex "__val". Python låter dig inte accessa "x.__val", till exempel. (Men det finns andra sätt att få ut värdet om man vill, så riktigt privat är det inte.)
Skriv svar