Forum: PC-Programmierung Parameter value autocompletion in Python


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Philipp (Gast)


Lesenswert?

Hallo zusammen,

ich bin gerade dabei ein paar Klassen zu basteln um meine Messgeräte zu 
steuern (Python3). Das Ganze soll am Ende so selbsterklärend wie möglich 
werden.

Hierzu suche ich eine elegante Möglichkeit durch automatische 
Vervollständigung des Editors (in meinem Fall Visual Studio Code bzw. 
Jupyter Lab) die möglichen Funktionen direkt zur Auswahl zu bekommen.

Ich stelle mir das ungefähr so vor:

Ich erzeuge eine Instanz der Klasse für mein 34401A. Um nun die 
gewünschte Messfunktion zu konfigurieren schreibe ich dementsprechend 
etwas in der Art wie:

hp34401.configure(function=

Wenn ich nun Tab drücke würde ich gerne eine Auswahl an Strings sehen, 
die dann eine Auswahl zulassen wie "DCV", "ACV" usw. Das Ganze natürlich 
abhängig vom Messgerät.

Ist so etwas machbar? Oder hat jemand eine bessere Idee sich bei der 
Konfiguration des Messgerätes möglichst weit von Autocompletion und Co 
unterstützen zu lassen?

Besten Dank
Philipp

von Mark B. (markbrandis)


Lesenswert?

Auto-Vervollständigung ist ja ein Feature des Editors, nicht der 
Programmiersprache. 🤔

von Marc (gierig) Benutzerseite


Lesenswert?

Snippets sind das Stichwort
Jedenfalls für VSC

https://code.visualstudio.com/docs/editor/userdefinedsnippets

Ähnliches gibt es auch für andere Editoren

von Philipp (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank für eure Antworten.

Mir ist schon klar, dass die Vervollständigung Sache des Editors ist, 
jedoch hatte ich gehofft, dass es ggf. noch ein paar Tricks gibt, die 
ich bisher nicht kenne um dem Editor über den Python Code zu verraten 
was hier alles passen könnte.

Was man z.B. ja tun kann ist eine Klasse mit den entsprechenden 
Parametern anzulegen. In etwa so:

class functions():
    def __init__(self):
        self.DCV = "ACV"
        self.DCI = "DCI"
        self.ACV = "ACV"
        self.ACI = "ACI"
        self.OHM2W = "OHM2W"
        self.OHM4W = "OHM4W"
        self.Frequency = "Freq"

Dann erzeuge ich eine Instanz dieser Klasse in der Instanz der 
Messgeräteklasse und kann dann die Funktion z.B. so setzen:

hp34401.conf(hp34401.function.DCV)

Im Anhang ist ein Bildchen wie es im Jupyter Lab dann auch vorgeschlagen 
werden kann. Das finde ich aber noch ein wenig sperrig beim verwenden.

Ggf. gibt es hier bessere Ideen.

Ziel soll es sein, beim Verwenden dieser Klassen die Möglichkeiten der 
Messgeräte über die Autovervollständigung vorgeschlagen zu bekommen. 
Egal ob es nun die Funktionen eines DMM sind oder die möglichen 
Wellenformen des Signalgenerators oder was auch immer.

von Lenny D. (le-do)


Lesenswert?

Statt der Instanz der selber gebastelten Klasse würde ich hier Enums 
verwenden.
https://docs.python.org/3/library/enum.html

In der Funktion vergleichst du dann nicht einen string sondern den Enum 
Wert.
1
If function == Modes.ACV:
2
    ...

Als Bequemlichkeit damit man trotzdem strings übergeben kann wenn man 
will kannst du das Argument konvertieren in der Funktion.
1
If not isinstance(function, Modes):
2
    function = Modes(function) #ungetestet, aber grobe Idee sollte gehen

Andere Kleinigkeit: mehr "Pythonic" wäre eventuell das verwenden von 
getter/setter properties.
1
hp34401.mode = Modes.ACV
Aber das ist natürlich Geschmackssache und wenn es bspw. Eine C API oder 
so schon gibt ist es im Zweifel besser nah daran zu bleiben als alle 
tollen Python Features zu nutzen.

von Karl (Gast)


Lesenswert?

Eine gute IDE kommt mit DocStrings zurecht. Vielleicht solltest du das 
mal gockeln.

von Marc (Gast)


Lesenswert?

Phillip nutzt wie oben erwähnt Visual Studio Code bzw. Jupyter Lab. Die 
können beide mit docstring umgehen.

Ich würde auch eher enums nutzen.

Beim docstring sollten die Funktionsparameter als reStructuredText 
formatiert sein,
dann stellt VSCode den docstring ggf. besser dar:
1
def configure(mode: Mode, label: str):
2
        """Configure Measuring Mode...
3
        :param mode: Mode.ACV, Mode.DCV, Mode.DCI, Mode.ACI
4
        :param label: Labeltext
5
        :returns: errorcode ...
6
        """
7
        #...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.