An die python cracks. Hilfe bei Minidisplay.

  • Jetzt machen wir das Treiben richtig verrückt ;) :

    Das, was wir hier erörtern, ist allerdings rein akademischer Natur. So programmiert man nicht. Möchte ich einen Wert innerhalb einer Funktion dem Rest der Welt zur Verfügung stellen, gebe ich ihn einfach als Rückgabewert dem aufrufenden Befehl/Anweisung zurück.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960

    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

    2 Mal editiert, zuletzt von PvD (24. Januar 2018 um 00:37)

  • @DaVu

    Ich habe doch NIE gesagt das Variablen IMMER global sind, das ist natürlich mumpitz.
    Ich habe gesagt das sie IMPLIZIT global sind und das deine Zuweisung sie EXPLIZIT zur lokalen
    Variable machen. Wenn aber keine Zuweisung stattfindet sind sie globale Variablen.

    Cheers
    Claudia

  • Ich habe doch NIE gesagt das Variablen IMMER global sind, das ist natürlich mumpitz.

    Dann habe ich wohl das "grundsätzlich" hier:


    Variablen sind grundsätzlich implizit global, erst wenn eine Zuweisung erfolgt könnte aus einer globalen Variable
    eine lokale werden.

    völlig missverstanden und es auf das "global" anstatt auf das "implizit" bezogen. ;)

    Ach ja, wie schön, dass wir uns einig sind und wie schade, dass man Betonungen in einem Forum nicht hören kann ;) :D

    @BJ1

    darauf habe ich ja weiter vorn auch schon hingewiesen, dass man mit "global <variable>" einen "äußeren" Wert überschreibt. Sowas würde mir auch im Traum nicht einfallen ;)

  • In welcher Version? Ist das was Neues, dass dürfte nicht funktionieren.

    In allen Versionen, soweit mir bekannt.

    Darauf habe ich sehr sehr weit vorn auch schon hingewiesen. Schade, dass du es nicht gelesen hast.

    An die python cracks. Hilfe bei Minidisplay.

    "
    Ich glaube, was @BJ1
    meinte war, dass es nicht gern gesehen ist, wenn man Variablen
    innerhalb einer Funktion als globale Variable definiert. Wahrscheinlich
    einfach aus Gründen der Lesbarkeit oder auch der Gefahr, dass eine zuvor
    global gesetzt Variable überschrieben werden könnte."

  • @DaVu

    Deutsch ist nicht meine Muttersprache aber war, bis dato, der Meinung das ich die ganz gut schreiben/sprechen
    kann. Ist an dem Satz etwas falsch?

    Variablen sind grundsätzlich implizit global, erst wenn eine Zuweisung erfolgt könnte aus einer globalen Variable
    eine lokale werden.

    >darauf habe ich ja weiter vorn auch schon hingewiesen, dass man mit "global <variable>" einen "äußeren" Wert >überschreibt. Sowas würde mir auch im Traum nicht einfallen

    Ich hoffe Du kommst nie in die Verlegenheit eine Singleton-Klasse erstellen zu müssen, ansonsten könnte
    Dir diese Aussage um die Ohren fliegen :D

    Cheers
    Claudia

  • Hab ich gelesen, aber ich bezog mich auf sein letztes Code Beispiel.

    Cheers
    Claudia

  • In welcher Version? Ist das was Neues, dass dürfte nicht funktionieren.

    Geht. Kommt zwar eine Warnung (SyntaxWarning: name 'x' is assigned to before global declaration), aber es erfolgt trotzdem die Zuweisung lokal.x an global.x

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960

    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • wenn du jetzt das 'implizit' mal weg lässt oder die Betonung auf 'global' legst, verstehst du vielleicht, wie ich es verstanden habe :thumbup:

    Von daher, wie so oft in Foren, der Unterschied zwischen einem geschrieben und gesprochenem Wort. Mein Fehler, nicht der deine.

    Ich bezog mich auch auf sein letztes Codebeispiel und das ist in allen mir bekannten Python-Versionen möglich.

    Zumindest schreibt er es on python2, was man am print Befehl sehen kann. In python3 habe ich das noch nicht getestet, würde mich aber wundern, wenn es nicht genauso aussieht.

    Abgesehen davon, dass in seiner Zeile 3 ein ":" fehlt :P :D

  • Abgesehen davon, dass in seiner Zeile 3 ein ":" fehlt

    Wo? Man sollte um diese Zeit ja auch eher schlafen...

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960

    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • Eine interessante Diskussion habe ich hier losgetreten. :)

    Nachdem ich dem ich den Code von meinem Add On neu geschrieben habe muss ich noch mal Danke für die Hilfe sagen.
    Es läuft schnell und zuverlässig. Ich bin sehr glücklich mit dem Ergebnis.

  • Ich habe auch schon mal überlegt ob ich einen "Ich lerne Python" Thread eröffnen soll und dort meine Erkenntnisse und Fragen stelle. Könnte ggf. interessant sein und mich hin und wieder auch als Noob identifizieren ;)

  • Ich habe auch schon mal überlegt ob ich einen "Ich lerne Python" Thread eröffnen soll und dort meine Erkenntnisse und Fragen stelle. Könnte ggf. interessant sein und mich hin und wieder auch als Noob identifizieren ;)

    Mach' doch! Das wäre dann der Weg 'Ich lerne Python' aus der Sicht des Schülers und nicht aus der Sicht des Tutors. Nennt sich 'inverted classroom' und zählt zu den durchaus erfolgreichen Lehrmodellen. ;)

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960

    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • Meines Wissens sind globale Variablen in einem Modul der einzige sichere Weg um zum Beispiel eine Singleton-Klasse abzubilden

    Darunter kann ich mir nichts vorstellen, eher im Gegenteil.
    Mit einem Singleton kann man ja etwas ähnliches wie eine globale Variable umsetzen.

    Kannst du das näher erläutern?

    btw: allerdings weiß ich auch nicht wie man einen Singleton in python umsetzt

  • Für alle die mitlesen
    Vorab: dies ist eine rein konzeptionelle Geschichte, heisst, natürlich
    kann ich eine Klasse erstellen und diese nur einmal im kompletten
    Program verwenden, nur ist dies dann keine wirkliche Singleton.
    Es geht darum, dass ein Objekt nur einmal existiert und ich
    dieses aus verschiedenen Codeteilen ansprechen kann und immer
    mit der gleichen Instanz interagiere.

    >Mit einem Singleton kann man ja etwas ähnliches wie eine globale Variable umsetzen.
    Ja, korrekt, Singleton-Klassen sind von Natur aus im globalen Umfeld zu sehen
    Eigentlich würde man ja als Pythonprogrammierer hergehen und dies ungefähr so angehen


    bei der Ausführung würde dass zum Beispiel so aussehen

    >>> s = singleton_object()
    >>> s.test
    42
    >>> s.set(21)
    >>> s.test
    21
    >>> j = singleton_object()
    >>> j.test
    21
    >>> j.set(34)
    >>> s.test
    34

    Eigentlich alles ok, s und j liefern den gleichen Wert.
    Kein Wunder, da beide ja das gleiche Objekt sind.
    id(s)
    3011504300L
    id(j)
    3011504300L

    Aber was passiert wenn ich zum Beispiel die Klasse ableite?


    Python
    class my_class(singleton_object):
        def __init__(self):
            pass

    m = my_class()
    m.test
    42
    id(m)
    3011436076L

    Oooppps - das war es mit der Singleton.
    Hätte ich alles in einem Modul, mit einer Variable test und eine Funktion set die die globale Variable ändert,
    dann kommt es zu so einem Problem gar nicht.

    Es gibt noch weitere Ansätze wie über MetaClass etc... aber alle, so weit mir bekannt, habe irgendwo ein Problem
    dass das Singleton-Konzept aushebelt.

    Cheers
    Claudia

  • Aber was passiert wenn ich zum Beispiel die Klasse ableite?

    Der Sinn davon ergibt sich mir (noch?) nicht. Ist es noch ein Singleton wenn es eine Unterklasse bzw ein Objekt dieser gibt?


    Hätte ich alles in einem Modul, mit einer Variable test und eine Funktion set die die globale Variable ändert,
    dann kommt es zu so einem Problem gar nicht.

    Klar stimmt schon. Wenn es jetzt wirklich nur eine Variable sein soll, ist ein Singleton echt overkill :D

  • Der Sinn davon ergibt sich mir (noch?) nicht. Ist es noch ein Singleton wenn es eine Unterklasse bzw ein Objekt dieser gibt?


    Im Sinne von die ableitende Klasse überschreibt nicht sondern erweitert, dann ja, dann sollte am Ende immer noch nur ein
    singleton objekt existieren. Das Beispiel mag jetzt nicht 100% sinnig sein, sollte nur zeigen das jemand der nur einen anderen
    Ansatz fährt das Konzept zunichte machen kann. Und dabei geht es nicht um absichtliches zerstören sondern nur weil evtl. fehlerhaft
    implementiert oder interpretiert.


    Klar stimmt schon. Wenn es jetzt wirklich nur eine Variable sein soll, ist ein Singleton echt overkill :D


    Es wird wahrscheinlich der seltenste Fall sein, das Hobbyprogrammierer tatsächlich auf dieses Problem stoßen.
    Und zu 99% würden Ansätze wie oben dies wahrscheinlich lösen aber wenn ich ein Projekt habe, dass ich nach außen geben will,
    sprich open source oder freeware mit plugin interface etc... dann sollte schon bewußt sein, dass dies evtl. meine Anwendung
    in Bedrängnis bringen kann.

    Cheers
    Claudia

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!