Python struct?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Python struct?

Inlägg av Icecap »

I C byggar jag ofta struct() med variabler. Praktisk till mycket.

Men nu är Python vad jag kan använda till mitt nuvarande projekt.

I det projekt har jag en hel del variabler som ska vara global.
Tänk att en rutin mäter en handfull spänningar via en National Instruments-enhet och att de spänningar ska användas i gemen genom programmet av många olika funktioner.

Resultatet är att jag behöver:

Kod: Markera allt

def Some_Function():
	global Voltage_01
	global Voltage_02
	osv. (många)
	# Här börjar själva funktionen
Det kunde vara mer överskådligt om jag kunde definiera en block av värden som jag sedan kunde inkludera i en enda global, typ:

Kod: Markera allt

	global Voltages
	global Other_Stuff
	# Här börjar själva funktionen
Men går det?
Min google-fu verkar inte klara denna nöt.

Jag vet att jag kan göra en Voltages[] och sedan indexera och det är kanske vad jag ska göra.
Typ:
VOLT525 = 0
VOLT330 = 1
VOLTREF = 2
VOLT_03 = 3
osv. o sedan indexera med Voltages[VOLT525]. Det känns dock ganska osmidigt.
Användarvisningsbild
AndLi
Inlägg: 17160
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Python struct?

Inlägg av AndLi »

Att vara beroende av globala variabler är väl ett feltänk?

Du kan väl bygga en klass med de variabler du vill ha tillgång till, det blir ju som en struct i sin enklaste form men med oändliga möjligheter framåt
Kulla
Inlägg: 1268
Blev medlem: 7 januari 2010, 10:06:11
Ort: Sandared
Kontakt:

Re: Python struct?

Inlägg av Kulla »

Skulle inte named tupples funka för det här?

https://docs.python.org/3/library/typin ... NamedTuple

Den stöder också types så du kan ha return type hur du vill, om du vill ha det som int eller vad som
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Python struct?

Inlägg av Icecap »

Jag utvecklade ju programmet som ett Quick-and-dirty lösning och ja, globala variabler är ju pest.

Nu är det mognad så pass att jag kan börja tänka på att göra rätt också.

Jag ska definitivt kolla på class.

Grundproblemet är att det finns en rutin för att mäta strömmar o spänningar som sedan bildar bas för godkännande för vidare test, programmering, automatisk trimning, loggning av värden osv.

Det finns 4 delvist olika testtyper, beroende på vilken kretskort (finns 5V o 24V versioner) samt utgångstyp (0-5V, 0-10V & 4-20mA).

Så det är många värden som många olika funktioner använder, vissa funktioner fyller in dessa värden o andra använder dom.
Användarvisningsbild
gustavn
Inlägg: 297
Blev medlem: 30 november 2004, 12:27:05
Ort: Linköping
Kontakt:

Re: Python struct?

Inlägg av gustavn »

En enkel dictionary kan väl funka?

d = dict()
d["Voltage_1"] = 134
d["Voltage_2"] = 5
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Python struct?

Inlägg av Icecap »

Har nu kollat en hel del o dict() verkar vara grejen.

Grundproblemet är att jag tar 1k mätningar av 8 spänningar - samtidig.

Jag tar sedan medel o standarddeviation av varje spänning o dessa värden använder jag lite varstans.

Men jag vill inte upprepa dessa mätningar utan anledning då varje mätning tar 1 sekund, alltså måste jag spara dessa värden till senare bruk.

Samtidig har jag en kortare mätfunktion (250 ms) för trimningsdelen, där jag bara hämtar 3 spänningar men fortfarande vill spara dom bland de 8 spänningar.

Jag har kommit ifrån den manuella test som tog ung. 5-8 minuter per kretskort till en mycket mer omfattande test, programmering o trimning på 13,2 sekunder per kretskort.

Så att upprätta en dict() med dessa värden vill om inget annat ge ett mer överskådeligt program.

Då jag samtidig har inställningar med vilken COM-port, filnamne, sökvägar, enhets-ID o annat vill det vara bra att samla dessa i ett eget dict(), igen för överskådelighetens skull.

Ett dict() med igångvarade test-val osv. känns rätt också.

Men i slutändan blir det bara en ihoppackning av globala värden på ett mer överskådeligt sätt.

Jag hade i övrigt problem med att disabla/enabla radio button i en Labelframe.
Radio button har ett icke fast antal knappar så det ville vara svårt att göra en fast rutin till att styra som jag vill.

Men jag har nu lagt varje radio button in i en o samma lista, medelst append(), och nu kan jag enabla/disabla i ett svep då jag även lade in "Start Test"-knappen i den lista.

Fungerar perfekt o mycket enkelt att överskåda. På måndag ska jag minska från en Enable-rutin o en Disable-rutin till en enda rutin där parametern (True/False) avgör om der enablas eller disablas.

Nu ska chefen bara se till att få fingern ur rumpan o göra de olika ELF-filer till de olika kretskort.
bus
Inlägg: 28
Blev medlem: 21 november 2014, 08:41:37

Re: Python struct?

Inlägg av bus »

Det går att göra mycket kul med dict i Python, men jag tycker du ska kolla på DataClasses. Dict och Named Tuples är ett naturligt val när man kommer från C-världen, men fördelen med att hantera data i classer är att du kan lägga till validering med mera.
https://docs.python.org/3/library/dataclasses.html

Jag bygger en hel del system som hantera mätvärden och kör ofta med Pytandic, vilket ger en hel del gratis. Nackdelen är att nuvarande version är lite långsam, men 2.0 är på gång och det utlovas rejäl prestandaförbättring.
https://docs.pydantic.dev/latest/
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Python struct?

Inlägg av Icecap »

Jag har nu testat lite o kammat noll.

Vad jag önskar är att jag t.ex. har en "struct" som kallas "Setting".
I "Setting" vill jag komma åt t.ex. Pos_X, Pos_Y osv. helst i formen: Setting.Pos_X = <något> eller <något> = Setting.Pos_X.

Jag kan såklart acceptera ett annat sätt att indexera i "Setting", t.ex. Setting[Pos_X] = <något> eller <något> = Setting[Pos_X].

Om jag använder dict() ska variabelnamnen ju anges i text vilket måste betyda att varenda gång jag vill använda den variabel slöa programmet ner en aning.

I "Setting" ska jag hålla 14 värden, dessa är ganska statiska.
I "Output" är det 7 värden - som uppdateras några gångar (4 - 10 gg) per test.
I "Measured" är det 10 värden som uppdateras ett par gångar per test.

EDIT: Vänta nu lite... Tror ta mig tusan att jag har fått till det!
Har helt enkelt gjort en class (nåja, 3 olika) och det fungerar tydligen. Ska testa att överföra alla variablerna till att uteslutande använda rätt class.
guckrum
Inlägg: 1691
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Python struct?

Inlägg av guckrum »

En klass är den generella lösningen, och kanske kan du låta dem ärva av varandra för mindre kod och onödiga upprepningar?

Annars finns det ju namedtuple som är snabb som en vanlig tuple (det är en typle) men supportar indexering medelst punktnotation, såhär:

Kod: Markera allt

from collections import namedtuple
data = namedtuple('data', "x y")  # skapar en typ "data" som har x och y som attribut
sample1 = data(1,2)               # skapa ett objekt "sample1" med x=1 och y=2
print(sample1)
#   data(x=1, y=2)
sample1.x
# 1
sample1.x + sample1.y
# 3
Du kan till och med ärva från en namedtuple. Men notera att tuples är immutable, dvs de kan inte ändras efter att de skapas. Borde funka bra till mätvärden.
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Python struct?

Inlägg av Icecap »

Fördelen med class är att det finns en initiator. Då kan jag enkelt skapa de default värden som behövs i systemet.

Men jag ska barbera mer i systemet o rensa upp. T.ex. kan jag köra den snabba mätning av utgången o svara tillbaka direkt med en klass, de mätningar används ju bara där o då.

Att göra en klass som ritar root vill vara en bra uppdelning, det finns nämligen en del dynamiska saker där med radio buttons med varierande antal val osv. Alla placeras dynamisk vid uppstart så att packa ihop de saker till en egen funktion vill vara bra.

Men jag har numera rensat upp till att ha variablerna i klasser o allt fungerar.

Sedan ska det snyggas till osv.
Användarvisningsbild
Icecap
Inlägg: 26148
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Python struct?

Inlägg av Icecap »

Jupp, class fungerar bra för detta.

Har fått rensat upp en del o gjort olika klasser som löser funktioner på ett enklare-att-läsa sätt.

O det fungerar bra. Efter upprensningen har jag hittat små grejer som kunde vara utförd bättre - o dom har jag såklart fixat.
Skriv svar