Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Klar kann man Funktionen in Logiken aufrufen, mache ich ständig. Was jedoch nicht so einfach geht, ist Funktionen aus andern Funktionen in der Logik aufzurufen. Das liegt daran, dass der Kontext der Logik nicht dem globalen Kontext eines Python Programmes entspricht. Die Funktionen sind lokal zum Lauf der Logik.
Zu dem Thema gibt es hier schon mindestens einen Thread im Forum. Da musst Du mal die Suche bemühen.
Viele Grüße
Martin
There is no cloud. It's only someone else's computer.
Danke den Thread habe ich gefunden. Also prinzipiell geht es wohl. :-)
Allerdings muss man wohl beachten, dass die Funktion im Code vor dem Aufruf "definiert" werden muss, sonst wird die nicht gefunden. Ich weiß nicht, ob das eine Eigenart von Python ist oder ob das hier bei SmartHomeNG so sein muss.
Was ich aber auch irgendwie nicht richtig gefunden habe, auch nicht im anderen Thread, wie kann ich items in der Funktion übergeben und diese daann darin auch verwenden?
Da muss ich Dir widersprechen. Ich hatte 'Eigenart' bewusst in Anführungsstriche gesetzt, da die Definition vor Nutzung für viele Programmiersprachen gilt. Ganz besonders für Interpreter-Sprachen wie BASIC. Das schließt nicht aus, dass es Implementationen dieser Sprachen gibt, die diese Einschränkung nicht haben. Das sind dann aber keine Interpreter-Inplementationen sondern Compiler mit anschließendem Linker.
Andererseits gilt diese Beschränkung auch für Compiler Sprachen wie Delphi-Pascal:
Routinen werden wie die globalen Typen, Konstanten und Variablen im Deklarationsblock oberhalb des begin vom Hauptprogramm deklariert. Die Routinen können sich auch untereinander aufrufen. Dabei gilt die Lesereihenfolge von oben nach unten: alle oben genannten Routinen sind denen darunter bekannt und können von diesen aufgerufen werden.
Viele Grüße
Martin
There is no cloud. It's only someone else's computer.
auch in C, C++ kannst Du nur bereits definierte Funktionen aufrufen. Das fällt da nur nicht auf, weil normalerweise alle Funktionen als forward deklarationen in den Header-Files stecken und diese gleich zu Anfang inkludiert werden.
Jupp, insbesondere bei Compiler-Sprachen wie Turbo Pascal / Delphi, Borland C, Basic etc. Wer einmal ein größeres Projekt in damaligen Zeiten auf den Kopf stellen musste, kennt das Gefluche.
Ich habe wahrlich keinen Komplettüberblick, aber die Unsitte, Funktionen / Prozeduren auch erst nach Gebrauch definieren zu können, scheint mir eine 'Unsitte' von modernen Interpretern zu sein ...
Die im Prinzip einfachste Lösung ist es selbst ein Plugin für den Eigengebraucht zu schreiben und die benötigten Funktionen dort unterzubringen. Das war auch mal ursprünglich 2013 der Rat von callidomus als ich die gleiche Problematik hatte. Allerdings ist bisher nix so kompliziert gewesen, das ich unbedingt ein Plugin hätte selber schreiben müssen.
Du kannst natürlich ein Plugin bauen, das aus einem bestimmten Verzeichnis alle *.py Dateien einliest und im Namensraum eines Plugins zur Verfügung stellt. Das wäre dann mal was für die Allgemeinheit :-)
auch in C, C++ kannst Du nur bereits definierte Funktionen aufrufen. Das fällt da nur nicht auf, weil normalerweise alle Funktionen als forward deklarationen in den Header-Files stecken und diese gleich zu Anfang inkludiert werden.
Das gilt aber nur für Funktionen, die du außerhalb der eigenen "Datei" aufrufen willst. Für Funktionen innerhalb eine Code-Datei braucht man das nicht.
Ich habe wahrlich keinen Komplettüberblick, aber die Unsitte, Funktionen / Prozeduren auch erst nach Gebrauch definieren zu können, scheint mir eine 'Unsitte' von modernen Interpretern zu sein ...
Was heißt "Unsitte"? Es ist nur eine Frage der Form. In den meisten Hochsprachen definiert man die Funktionen ja sowieso strukturiert in einer eigenen Datei. Bei kurzen Codezeilen ist es eher eine Frage des persönlichen Geschmacks. Und ich packe die Funktionen lieber ans Ende, weil ich die weniger oft anfasse als den eigentlichen "Programm"-Code. Wobei das sowieso sehr abstrakt ist, weil wenn man über C++ / C# redet ist sowieso fast jede Funktion woanders definiert.
Wobei mir das auch nicht ganz klare ist in Python. Hier mal ein Auszug aus einem plugin:
Du kannst natürlich ein Plugin bauen, das aus einem bestimmten Verzeichnis alle *.py Dateien einliest und im Namensraum eines Plugins zur Verfügung stellt. Das wäre dann mal was für die Allgemeinheit :-)
Das ist eine gute Idee. Macht aber nur Sinn, wenn es Funktionen sind, die man immer mal wieder brauchen würde. Bei mir geht es explizit um eine Bewässerungssteuerung und die macht für globale Funktionen wenig Sinn. Ich werde die aber dennoch zur Verfügung stellen, wenn es so läuft, wie ich mir das gern vorstelle. Die Funktion aber deshalb, damit ich nicht für jeden Sprinklerkreis die kompletten Konditionen prüfen muss und dafür jedes mal den gleichen Code habe.
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar