Queueing zwischen zwei Klassen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
headhunter1978
User
Beiträge: 20
Registriert: Sonntag 18. November 2018, 11:15

Hallo zusammen,

Code: Alles auswählen


import queue
import time

class ClassA():

    def send(self, message_nums=10)
    
        for n in range(message_nums):
            time.sleep(0.2)
            queue.put('message number: {}'.format(n))

class ClassB():
    
    def receive(self):

        while True:
            try: 
                item = queue.get(timeout=1)
                print(item)
            except queue.Empty:
                break

        print('done.')

    

if __name__ == "__main__":
    queue = queue.Queue()

    classA = ClassA()
    classB = ClassB()

    classA.send()
    classB.receive()
Bei Ausführen des Skriptes bekomme ich folgende Fehlermeldung: AttributeError: 'Queue' object has no attribute 'Empty'. Habt ihr eine Idee, was ich falsch mache?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du den Namen des Moduls mit einem Variablennamen überschattest, dann ist das das Ergebnis. Du musst deinen queue Namen ändern. Am besten indem du auf die eh schlechten globalen Variablen verzichtest, und deine Klassen auch wirklich nutzt. Und die Queue als Argument an die beteiligten Objekte im Konstruktor übergibst.
headhunter1978
User
Beiträge: 20
Registriert: Sonntag 18. November 2018, 11:15

Hallo,

Danke für die schnelle Antwort.

Ich habe den Code nochmal abgeändert. Irgendwie habe ich immer noch einen Denkfehler. Self.q hat nicht das Attribute Empty.

Code: Alles auswählen

import queue
import time

class ClassA():

    def __init__(self, q):
        self.q= q

    def send(self, message_nums=10):
    
        for n in range(message_nums):
            time.sleep(0.2)
            self.q.put('message number: {}'.format(n))

class ClassB():

    def __init__(self, q):
        self.q= q
    
    def receive(self):

        while True:
            try: 
                item = self.q.get(timeout=1)
                print(item)
            except self.q.empty:
                break

        print('done.')

    

if __name__ == "__main__":
    queue = queue.Queue()

    classA = ClassA(queue)
    classB = ClassB(queue)

    classA.send()
    classB.receive()

__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natürlich hat es das nicht. Empty ist eine exception. Die ist im MODUL queue zu finden.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und den Namen queue hast du immer noch global. Womit du den Modulnamen immer noch überbrätst. Das gehört in eine main-FUNKTION. Und die aus dem __main__-Guard aufgerufen.
Antworten