Universelle Schnittstelle für Labornetzteile: ich steh gerade auf dem Schlauch

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Hi, ich habe gerade einen Blackout und benötige eine kleine Erleuchtung.

Ich möchte eine generische API für Labornetzteile programmieren. Also sowas wie pwr.set_voltage(), pwr.get_current() usw. Das soll für alle Netzteile gleich sein.

Allerdings können sich die Protokolle unterscheiden und auch die Hardwareschnittstelle kann von RS232 bis Ethernet reichen.

Ich stehe gerade komplett auf dem Schlauch, wie man das in Python macht. In Rust würde ich vermutlich ein Trait verwenden und für jedes Netzteil eine eigene Implementierung. Aber für Python fehlen mir gerade die passenden Suchbegriffe.
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@burli: In Python denkst Du Dir das/den Trait falls es keine Funktionskörper enthält einfach und schreibst für jedes Netzteil eine eigene Implementierung. Ansonsten halt eine (abstrakte) Basisklasse und dann für jedes Netzteil eine Implementierung.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Eigentlich hast du Recht, ich kann ja einfach jedes Netzteil mit import xyz as pwr importieren. Eigentlich bin ich doof :Facepalm:

Ich danke dir für das Licht im Dunkel
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Traits sind nicht ganz das gleiche wie Klassen, weil man bei Klassen in der Regel nur von einer Basisklasse erbt, aber das Beispiel aus Rust by Example https://doc.rust-lang.org/rust-by-example/trait.html kann man im Python in etwa so umsetzen:

Code: Alles auswählen

#!/usr/bin/env python3


class Animal:
    def __init__(self, name, is_naked=False):
        self.name = name
        self.is_naked = is_naked

    @property
    def noise(self):
        raise NotImplementedError

    def talk(self):
        print(f"{self.name} says {self.noise}")


class Sheep(Animal):
    @property
    def noise(self):
        return "baaaaah" + ("?" if self.is_naked else "!")

    def talk(self):
        print(f"{self.name} pauses briefly... {self.noise}")

    def shear(self):
        if self.is_naked:
            print(f"{self.name} is already naked...")
        else:
            print(f"{self.name} gets a haircut!")
            self.is_naked = True


def main():
    dolly = Sheep("Dolly")
    dolly.talk()
    dolly.shear()
    dolly.talk()


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Super, ich danke dir für die Mühe. Ich werde mir anschauen, wie ich es umsetze.
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Antworten