Sida 1 av 1

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

Postat: 6 februari 2018, 11:31:23
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.

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

Postat: 6 februari 2018, 11:55:10
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

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

Postat: 6 februari 2018, 12:20:13
av lillahuset
Stort tack! :D

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

Postat: 6 februari 2018, 12:27:25
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

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

Postat: 6 februari 2018, 12:49:37
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)

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

Postat: 6 februari 2018, 12:52:28
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.

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

Postat: 6 februari 2018, 14:14:34
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

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

Postat: 14 juni 2018, 19:14:44
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.

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

Postat: 14 juni 2018, 19:42:04
av baron3d
Borland Builder är riktigt bra !

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

Postat: 14 juni 2018, 20:08:48
av lillahuset
Que?

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

Postat: 14 juni 2018, 20:38:13
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.

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

Postat: 14 juni 2018, 20:58:22
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. :)

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

Postat: 14 juni 2018, 21:09:37
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.

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

Postat: 14 juni 2018, 21:48:25
av lillahuset
Luktar klassisk BASIC lång väg. :(

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

Postat: 14 juni 2018, 22:02:22
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.)