@Hautamaeki: Das kann nur passieren wenn `Ultrasonic()` ein `int` zurück gibt oder Du irgendwo die Attribute an eine ganze Zahl bindest.
Kann es sein, dass Du hier anderen Quelltext zeigst als Du tatsächlich einsetzt? Zum Beispiel welchen wo auch `sensor_l` und `sensor_r` in der `__init__()` an 0 gebunden werden?
Dieser Klassenentwurf mit den ganzen Dummywerten für die Attribute in der `__init__()` ist schlecht. Offensichtlich kann man mit dem Objekt direkt nach dem Erstellen *nichts* anfangen ausser die `Connect()`-Methode aufzurufen. Dann stellt sich aber die Frage warum der Code aus `Connect()` nicht in der `__init__()` steckt‽
Sollte es an dem unsäglichen Fehlerrückgabewert bei `Connect()` liegen, der eigentlich ein Wahrheitswert wäre, wo die Zahlenwerte aber genau entgegen der Intuition gewählt wurden (wir sind hier nicht bei C-Programmierung), ist das kein guter Grund. Ausnahmen wurden erfunden um diese speziellen Fehlerrückgabewerte loszuwerden. Und Du verwendest jetzt Ausnahmebehandlung um genau diesen Mist wieder einzuführen.
Zumal die Ausnahmebehandlung mit dem nackten ``except:`` grundsätzlich keine gute Idee ist. Das verschluckt *alle* Ausnahmen und tut so als wenn die Verbindung nicht zustande gekommen wäre. Auch dann wenn die Verbindung doch zustande kam und/oder das Problem ganz woanders lag. Zum Beispiel eine `NameError` oder `AttributeError` wenn Du Dich irgendwo im ``try``-Block bei einem Namen vertippt hast. Viel Spass bei der Fehlersuche in solchen Fällen. Zu einem ``except`` gehören entweder konkrete Ausnahmen die man erwartet, oder man ``raise``\d die Ausnahme im ``except``-Block, oder man protokolliert sie irgendwo, damit unerwartete Ausnahmen nicht unentdeckt bleiben.
Werte wie -1 und 0 als spezielle „Hier ist noch nichts”-Werte sind ungünstig. Insbesondere wenn sie in der weiteren Verwendung nicht zwingend auffallen. Für „Nichts” gibt es in Python den Wert `None`.
Und wie schon gesagt: Python kennt Wahrheitswerte, da sollte man keine Zahlen zu missbrauchen. Bei `True` und `False` weiss der Leser sofort welcher Wertebereich sehr wahrscheinlich zulässig ist. Bei 0 und 1 könnte man denken es käme auch -1 oder 42 in Frage.
Abkürzungen sollte man vermeiden, solange sie nicht allgemein bekannt sind.
Aus den Gettern könnte man Properties machen. Siehe die `property()`-Funktion.
Zur Namenskonvention und Leerzeichensetzung/Einrückung könntest Du mal einen Blick in den
Style Guide for Python Code werfen.
Edit: Ungetestet:
Code: Alles auswählen
class ConnectNxt(object):
def __init__(self, address):
self.team_id = None
self.team_position = None
self.player_id = None
LOG.info('Connecting to NXT')
self.sock = nxt.bluesock.BlueSock(address).connect()
self.motors = [Motor(self.sock, p) for p in [PORT_A, PORT_B, PORT_C]]
self.synchronized_motors = nxt.SynchronizedMotors(
self.motors[1], self.motors[2], 0
)
self._left_sensor = Ultrasonic(self.sock, PORT_1)
self._right_sensor = Ultrasonic(self.sock, PORT_2)
LOG.info('battery %s', self.battery_level)
@property
def battery_level(self):
return self.sock.get_battery_level()
@property
def left_sensor(self):
return self._left_sensor.get_sample()
@property
def right_sensor(self):
return self._right_sensor.get_sample()
`LOG` ist ein modulglobaler Logger aus dem `logging`-Modul. Bei `info()` muss man die Stufe noch entsprechend setzen, damit das ausgegeben wird.