Forum: PC-Programmierung Parameter value autocompletion in Python


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and 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 D. (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
        #...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.