Das ist wahrscheinlich eine blöde Frage, aber sie hat mich aus einem Ruby-Hintergrund ratlos gemacht.
Ich habe ein Objekt, das so aussieht, wenn ich versuche, es zu drucken.
%Vor%Ich habe erwartet, dass der tatsächliche Wert der Eigenschaft task_id hier gedruckt wird. Wie komme ich zum tatsächlichen Wert?
UPDATE 1
%Vor%Beste Grüße.
Kurzgeschichte, verwenden Sie in der Funktion scan
scan.request.id
.
Siehe Ссылка
Sie greifen auf die property
der Klasse zu, während task_id
auf a steht Eigenschaft von Instanzen von AsynchResult
.
Um den Wert von task_id
zu erhalten, müssen Sie zuerst eine Instanz dieser Klasse erstellen, danach wird Ihnen der Zugriff auf asynch_result_instance.task_id
die echte ID zurückgeben.
In Ihrem aktualisierten Code:
%Vor% Hier greifen Sie auf die Klasse zu, wie ich bereits erklärt habe. Was Sie möchten, ist eine Instanz der aktuell ausgeführten Aufgabe. Sie können celery.current_task
verwenden, um das aktuell ausgeführte Aufgabenobjekt zu erhalten:
Oder, wenn Sie an der eindeutigen ID interessiert sind, verwenden Sie die request
Attribut der dekorierten Funktion:
In diesem zweiten Fall verwenden Sie nicht eine lokale Variable namens scan
, sonst werden Sie eine UnboundLocalError
.
(Code nicht getestet, da ich celery
nicht installiert habe.)
Die property
s sind Deskriptoren , die für den attributbasierten Zugriff verwendet werden Getter / Setter-Methoden, damit Sie auf Daten wie:
Aber wenn der Code ausgeführt wird, kann der Setter oder Getter steuern, was passiert.
Sie können dies mit einer Dummy-Klasse überprüfen:
%Vor% Um Ihre Aufgaben "OO-ähnlicher" zu machen, könnten Sie das Argument bind
verwenden, um einen Verweis auf self
:
Bitte beachten Sie, dass self.request.id
tatsächlich eine Instanz von AsyncTask
ist. Um die Task-ID als string zu haben, sollten Sie self.request.id.__str__()
.
Aus Selleries Dokumentation (nach dem Beispiel):
Das Argument
bind
bedeutet, dass die Funktion eine "gebundene Methode" ist, damit Sie auf Attribute und Methoden der Aufgabentypinstanz zugreifen können.