@audacity363: Der Reflex mit den Klammern wäre auch in C falsch, denn auch dort hat ``function(callback())`` und ``function(callback)`` eine Unterschiedliche Bedeutung. Wobei die sich mit der Bedeutung in Python decken, im ersten Fall wird `callback` aufgerufen und der Rückgabewert an `function` übergeben, und im zweiten Fall wird die Funktion `callback` als Wert an die Funktion `function` übergeben. In Java sind Methoden keine Werte, da behilft man sich mit Exemplaren von Klassen die (nur) eine Methode haben, die über ein Interface festgelegt ist. In der Praxis sieht das dann so aus (ungetestet)
Code: Alles auswählen
function(new ICallback() {
void callback(int value) { /* ... */ }
});
Wenn Du später ein Programm aus einzelnen Schnippseln zusammensetzt schreibst Du es ja eben *nicht* neu‽ Man sollte sich vernünftige und den Konventionen entsprechende Namen eigentlich grundsätzlich angewöhnen. Denn dieses „später” in „das mache ich später” kommt oft genug nie. Bis man dann selbst nach einem Jahr eigenen Quelltext liest und ihn nicht mehr versteht, oder der für erfahrene Programmierer komisch aussieht. Ich kann mich ja noch an `mixedCase`-Namen beim Lesen gewöhnen, aber alles was mit einem Grossbuchstaben anfängt ist in meinem Kopf ein Klassenname. Das kenne ich so aus Python und auch aus Java und finde es extrem verwirrend wenn jemand anfängt Funktionen so zu benennen. Das machst Du doch in Java (hoffentlich) auch nicht.
`message` ist eine Liste weil Daten als Bytes gesendet werden müssen ist eine komplett unsinnige Aussage. Das erklärt warum man ein `bytes`-Objekt verwendet, aber nicht warum *das* als einziges Element in einer Liste stecken muss. Vor dem versenden holt Du das ja auch aus der Liste heraus.
In Python wird (fast) nichts deklariert. Und wenn Du mit „oben im Programm” meinst, dass auf Modulebene der Name `Arduino_status` definiert ist, dann können da nicht alle drauf zugreifen. Nämlich die Funktionen nicht, die einen gleichlautenden lokalen Namen besitzen. Das ist in Java und C auch nicht anders, also kannst Du nicht zu weit in Java gerutscht sein.
Code: Alles auswählen
int answer = 42;
void foo(int value) {
int answer = value; // Hat keinen Einfluss auf `answer` ausserhalb der Funktion.
}
Wenn man in Python irgendwo in einer Funktion/Methode etwas an einen Namen bindet, ist das für die ganze Funktion ein lokaler Name.
Wenn Du den Status nach aussen geben möchtest, läuft das auf eine Klasse hinaus. Und man sollte dann den Zugriff auf das Flag vielleicht auch gegen gleichzeitigen Zugriff und Verändern schützen, beziehungsweise gleich einen entsprechenden Typ aus dem `threading`-Modul verwenden.
Wobei diese Konstruktion sowieso nicht wirklich für den Einsatzzweck aus dem Aufruf-Beispiel passt. Da hätte man vorher auch einfach nur „pingen” können bis das erfolgreich war ohne das man einen eigenen Thread dafür starten muss. Die ganze Komplexität die sich daraus ergibt, bringt keinen Mehrwert.