partialmethod: Connect -> Bestimmte Methoden als innerfunctions ->partialmethod:Disconnect ?

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
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Hej!
Ich steh mal wieder vor einem Problem. Ich möchte 2 Methoden einer Klasse "immer" aufrufen. Da in dieser API keine "automatische" Connect oder Disconnect.
Mein Beispiel Code in abgewandelter Form. Nicht Lauffähig und wahrschein völlig dämlich

Code: Alles auswählen

import anki_vector
from anki_vector.util import distance_mm, speed_mmps, degrees
from functools import partialmethod

class Vector:
    def __init__(self, serial):
        self.serial = serial
        self.robot = anki_vector.Robot(serial=self.serial)
        self._alive = False
        
        def start_fast_immer_diese(func):
            self.connect()
            func()
            self.terminate_connection()
            
        self.wie_rufe_ich_dich_auf = partialmethod(start_fast_immer_diese(), func="?")

    def connect(self):
        self.robot.connect()

    def terminate_connection(self):
        self.robot.disconnect()

    def say_text(self, msg):
        self.g = partialmethod(self.connect(),)
        self.robot.behavior.say_text(msg)

    def vector_battery_status(self):
        return self.robot.get_battery_state()
        
if __name__ == '__main__':
    test = Vector()
    test.say_text("lala") # aber vorher start_fast_immer_diese(func) 
    test.vector_battery_status() # ohne die innerfunction <- läuft
Ich bin mir "fast" sicher das ich mit functools.partialmethod auf dem richtigen weg bin. Desweiteren wahrscheinlich Dekoratoren?
Allerdings platz mir da der Kopf...Ich hab diese Thema nicht wirklich durchdrungen.

Bin ich auf dem totalen Holzweg?
Oder wie würdet ihr das lösen? Ich hab auch an eine Vererbung gedacht, wo die Subclass mit oder ohne die innerfunction läuft. Allerdings hab ich auch noch nicht verstanden wie ich die jeweilige Methode anspreche ohne dass der Methodenaufruf "länger" wird. "test.vectorsubclass.mit_innerfunction.saytext()

Beste Grüße aus der großen Stadt

Nachtrag: Kann ich Methoden mit with ausstatten?

Code: Alles auswählen

    def say_text(self, msg):
        with anki_vector.Robot(serial=self.serial) as self.robot:
            self.robot.behavior.say_text(msg)
Aber das würde sich ja dann in allen Methoden wiederholen. Das erscheint mir nicht richt
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Was möchtest Du eigentlich machen? Ehrlich gesagt kann ich nichts aus Deiner Beschreibung herauslesen. Etwas, was nicht lauffähig ist, ist auch schwierig zu verstehen. partialmethod erwartet als erstes erstes Argument eine ungebundene Methode, im einen Fall übergibst Du aber den Rückgabewert des Aufrufs einer lokalen Funktion, im zweiten den Rückgabewert des Aufrufs einer gebundenen Methode.

Die Variable bei with ist immer lokal, weil der with-Block nur lokal gültig ist. Stattdessen ein Attribut zu verwenden, ist also unsinnig.
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Im Grunde genommen, versuche ich 2 verschiedene Aufrufe der Klasse zu schreiben.
Aufruf 1: Klasse.methode(var) aber vorher soll noch eine Methode gestartet werden und nach der Aufgerufen Methode soll eine andere gestartert werden.
Quasi:
Klasse.methode(var1) = Klasse.connect() -> Klasse.methode(var1) -> Klasse.disconnect()
als "Alternative schreibe ich in jede Methode den Discconect rein.

Denk ich hier zu Kompliziert?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Das hört sich nach der Aufgabe eines Dekorators an.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Und nach der eines contextmanagers.
In specifications, Murphy's Law supersedes Ohm's.
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Super Danke!
Ich denke das ist genau der Input den gesucht habe.
Antworten