@rob87: Als erstes mal sollte man das bisschen Code nicht unnötigerweise auf drei Module verteilen. Wobei `funct` auch ein sehr schlechter Modulname ist. Namen generell sollen dem Leser vermitteln was der Wert dahinter bedeutet.
Dann wäre es praktisch wenn Du den tatsächlichen Code zeigst inklusive kompletten Traceback. Dein Teil 1 sollte nämlich keinen Laufzeitfehler liefern. 1. Weil er gar nicht am Compiler vorbeikommt, 2. sehe ich auch nicht wie man *die* Ausnahme bekommen kann, selbst wenn man die beiden Syntaxfehler beheben würde.
Und auch bei der Zeiten Ausnahme, die zwar korrekt wäre, würde der Compiler *voher* bereits über einen anderen Syntaxfehler stolpern.
Und was ist Deine konkrete Frage zu dem Syntaxfehler bei ``print(%StrVal)``? Was denkst Du denn was das ``%`` da zu suchen hat?
Eingerückt wird in Python mit vier Leerzeichen pro Ebene.
Namen werden klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Man sollte keine Abkürzungen verwenden, schon gar keine ein- oder zweibuchstabigen, sondern aussagekräftige, ausgeschriebene Namen verwenden. Ist ja nicht mehr BASIC auf 8-Bit-Rechnern wo nur ein bis zwei Zeichen pro Name erlaubt/signifikant waren. Ebenfalls wichtig ist Gross-/Kleinschreibung — wenn man eine Klasse `stick` nennt, kann man die nicht als `Stick` aufrufen um Objekte davon zu erstellen, das gibt einen `NameError`.
Wenn man zwei Vergleiche gegen ein gemeinsames Argument mit ``and`` verknüpft, bringt in der Regel ein verketteter Vergleich einen etwas kürzeren und leichter verständlichen Ausdruck. Wobei die Vergleichswerte nicht zum Kommentar passen. Da steht Werte von 0.0 bis 1.0, vergleich schliesst aber 0 selbst aus und erlaubt Werte bis 100 statt nur bis 1. Was denn nun? Falsche Kommentare/Dokumentation ist schlechter als gar keine.
Was ebenfalls falsch aussieht ist das die Funktion nichts zurück gibt. Auch das passt nicht zu Kommentar/Dokumentation und auch nicht dazu wie der nicht vorhandene Rückgabewert später verwendet wird.
Die Diskrepanz zwischen Kommentar/Dokumentation und Code bezüglich der Rückgabetypen ist auch schräg. Die ”Xbox”-Funktionen geben laut Kommentar/Dokumentation Zahlen zurück, der Code sieht aber so aus als wären es Zeichenketten‽
Methoden brauchen ein `self`-Argument. Und falls das nicht verwendet wird, ist das semantisch auch keine Methode und braucht einen Grund warum man das in eine Klasse steckt. Falls meinen keinen hat: Entweder die ”Methode” aus der Klasse herausnehmen oder als `staticmethod` dekorieren.
Da `stick` semantisch so wie's da steht keine Klasse ist sondern einfach nur zwei Funktionen, macht auch `Controller` keinen Sinn.
Selbst wenn es eine `Stick`-Klasse gäbe, würde man keine andere Klasse als Namensraum für zwei Exemplare davon missbrauchen. Diese Klasse dann in einem anderen Modul an einen kryptisch abgekürzten Namen zu binden, macht das ganze noch absurder.
Grunddatentypen haben in Namen nichts zu suchen und wie gesagt keine Abkürzungen: `StrVal` → `value`.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Von dem Beispiel bliebe dann ungefähr so etwas übrig:
Code: Alles auswählen
#!/usr/bin/env python3
def get_horizontal_position():
"""
Get stick X axis value scaled between -1.0 (left) and 1.0 (right) with
deadzone tolerance correction.
"""
#
# FIXME Docs say floating point values, code says string.
#
return "Horizontale positon"
def get_right_position():
"""
Get stick axis between middle position (0.0) and right (1.0).
"""
wert = -0.1
#
# FIXME Either the docs or this code ist wrong.
#
if 0 < wert < 100:
print("PWM Wert ist gültig")
else:
print("0")
#
# FIXME I'm quite sure this function should return something and presumably
# numbers and not strings.
#
def print_value(value):
print("Return Unglütlig oder leer" if value in ["", "0"] else value)
def main():
print_value(get_horizontal_position())
print_value(get_right_position())
if __name__ == "__main__":
main()