Kommen nicht an eine Variable ran.

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
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*

import os
import gtk
import gobject
import dbus
import dbus.glib
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop

import threading
import subprocess

gobject.threads_init()
dbus.glib.init_threads()

class Control(dbus.service.Object):
    def __init__(self, name):
        self.name = name
        self.path1 = "/dk/programms/"
        self.path2 = "dk.programms."
 
        self.bus_name = dbus.service.BusName(self.path2 + self.name, bus = dbus.SessionBus())
        dbus.service.Object.__init__(self, self.bus_name, self.path1 + self.name)

    @dbus.service.method(self.path2 + self.name)    
    def close(self):
        print "close \n" * 20
        pid = str(os.getpid())
        subprocess.Popen(["kill", pid])

    
    def mainloop(self):
        gtk.main()

    def run(self):
        t = threading.Thread(target = self.mainloop)
        t.start()
Das Problem ist das der Decorator nicht auf die Variablen zugreifen kann self.path2 und self.name zugreifen kann.

Die Variable path2 könnte ich auch direkt unter der Klasse definieren

Code: Alles auswählen

class AB():
    path2 = "dhhdkk"
das würde gehen, nur die variable Namen muss ich übergeben können.

Ist sicher einfacher als ich denke, komme nur nicht drauf.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Habe jetzt was:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*

import os
import gtk
import gobject
import dbus
import dbus.glib
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop

import threading
import subprocess

gobject.threads_init()
dbus.glib.init_threads()

def c(name):
    NAME = name
    class Control(dbus.service.Object):
        path1 = "/dk/programms/"
        path2 = "dk.programms."
    
        def __init__(self):
            self.bus_name = dbus.service.BusName(self.path2 + NAME, bus = dbus.SessionBus())
            dbus.service.Object.__init__(self, self.bus_name, self.path1 + NAME)
    
        @dbus.service.method(path2 + NAME)    
        def close(self):
            print "close \n" * 20
            pid = str(os.getpid())
            subprocess.Popen(["kill", pid])
    
        def mainloop(self):
            gtk.main()

        def run(self):
            t = threading.Thread(target = self.mainloop)
            t.start()

    return Control()
Das kanns aber noch nicht gewesen sein, oder?
Schön ist denke ich was anderes.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das Problem ist schlicht und einfach, dass die Dekoratoren nicht auf `self` zugreifen koennen, da das `self` nicht im Scope ist. Genauer: Sie koennen es schon, aber du kannst kein `self` uebergeben an den Dekorator uebergeben.

Die Loesung ist Klassenscoping zu benutzen, aber nicht das ganze in eine sinnlose Funktion zu verpacken.

- `self.path{1,2}` solltest du so nicht mehr nutzen, wenn du Klassenattribute nutzt.
- fuer Pfade gibt es immernoch `os.path.join`
- `path2` laesst sich doch bestimmt aus `path1` erzeugen? Aussagekraeftige Namen kann man doch bestimmt auch nutzen?
Andyh
User
Beiträge: 319
Registriert: Dienstag 8. Januar 2008, 19:52
Kontaktdaten:

Hallo

Danke damit müsste ich doch was anfangen können.

zu:
- `self.path{1,2}` solltest du so nicht mehr nutzen, wenn du Klassenattribute nutzt.
schon klar, habe ich ja nicht gemacht, ich habe nur ein Beispiel gemacht das es so geht

zu:
- fuer Pfade gibt es immernoch `os.path.join`
ja gibt es aber für sowas einfaches nicht und was solls bringen?
Ich erstelle die Variable ja mit einem "/" am Ende und wenn der übergebene Name mit "/" anfängt dann baut er es ja eh nicht zusammen und dbus gibt es nicht unter WIN deswegen fällt "\" auch weg

zu:
- `path2` laesst sich doch bestimmt aus `path1` erzeugen? Aussagekraeftige Namen kann man doch bestimmt auch nutzen?
ja "path2 = path1.replace("/", ".")", gut die Namen sind kacke, aber bis ich das geschrieben habe habe ich "path2 = ...." auch fertig und weil es fixe Pfäde sind die sich auch nicht mehr ändern macht das auch nichts

Soll jetzt nicht als Beleidigung oder Angriff rüberkommen, ich wollte nur zeigen das ich in den 1 1/2 jahre python auch was gelernt.

###EDIT###
Komme nicht darauf wie das mit scope gehen soll.
Ich importiere die Klasse und schon beim importieren wird der NameError geworfen.

Gruß
Andyh
Meinen Dickschädel schon bemerkt?
Ich bin jetzt FACHARBEITER (Zerspanungsmechaniker)!!!
[code]import sys

if sys.platform == "win32":
print "this program only runs on operating systems!!!"
sys.TotalError()[/code]
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

cofi hat geschrieben:- fuer Pfade gibt es immernoch `os.path.join`
Der Pfad ist ein Objektpfad und ist in der Spezifikation von dbus so festgelegt, der bleibt auch auf Windows so. Würde man os.path.join nutzen würde dass ganze mit einer Windows Implementation von dbus nicht mehr gehen, wobei ich mir nicht sicher bin ob es überhaupt eine gibt die produktiv eingesetzt wird.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Andyh hat geschrieben:schon klar, habe ich ja nicht gemacht, ich habe nur ein Beispiel gemacht das es so geht
Doch hast du, siehe Zeile 26/27, auch wenn es "nur" ein Beispiel ist.
Andyh hat geschrieben:ja gibt es aber für sowas einfaches nicht und was solls bringen?
Ich erstelle die Variable ja mit einem "/" am Ende und wenn der übergebene Name mit "/" anfängt dann baut er es ja eh nicht zusammen und dbus gibt es nicht unter WIN deswegen fällt "" auch weg
D-Bus gibt es unter Windows, allerdings bin ich da nicht fit, ob es fuer deinen `path1` etwas aendert, ich wollte damit ja eigentlich herausbekommen, ob das Sinn macht :twisted: Ich meinte aber primaer wieder Zeile 26/27, nicht das literal.
Deine Begruendung ist btw falsch, es sei denn du uebergibst `name` mit einem fuehrenden Slash.
Andyh hat geschrieben:ja "path2 = path1.replace("/", ".")", gut die Namen sind kacke, aber bis ich das geschrieben habe habe ich "path2 = ...." auch fertig und weil es fixe Pfäde sind die sich auch nicht mehr ändern macht das auch nichts
Selbst dann verletzt du das DRY-Prinzip, entsprechen sich die Pfade immer, solltest du - im eigenen Interesse - auch nur einen Ort haben, den du aendern musst. Wenn der Pfad im Uebrigen fix ist, kann es sein, dass du sowas noch oefters in Klassen schreibst? Wenn ja, solltest du dir ueberlegen ob du das nicht in eine `config.py` ablegst - wobei das auch jetzt schon Sinn machen wuerde. Das umginge auch besser dein Scope-Problem.
Andyh hat geschrieben:Soll jetzt nicht als Beleidigung oder Angriff rüberkommen, ich wollte nur zeigen das ich in den 1 1/2 jahre python auch was gelernt.
Keine Sorge, so sehe ich das ganz und gar nicht. Es geht hier schliesslich um den Code, nicht um mein Ego ;)
Andyh hat geschrieben:Komme nicht darauf wie das mit scope gehen soll.
Ich importiere die Klasse und schon beim importieren wird der NameError geworfen.
Richtig, weil an dem Punkt die Klasse evaluiert wird und es kein `self` gibt. Nach dem `self` wird in der Klasse - nicht in Methoden - und in den aeusseren Scopes gesucht. Ein - imho ein dreckiger Hack - Weg waere es einen neuen Dekorator zu schreiben, das sich die Argumente der dekorierten Methode anschaut und mit dem ersten den D-Bus-Dekorator fuettert. Aber bitte nicht.

@DasIch: Das ist dann aber `path2` nicht `path1` oder sehe ich das falsch?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

cofi hat geschrieben:@DasIch: Das ist dann aber `path2` nicht `path1` oder sehe ich das falsch?
Ja. Es gibt einmal mit Punkten getrennte Pfade und einmal die mit Slashes. Ersteres quasi der Pfad zur Klasse, letzteres zur Instanz.

Du könntest also org.project.Page haben welches du benutzt um mehrere Pages anzulegen, z.B. org/project/page/123
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ok, danke fuer die Infos. Damit ist `os.path.join` natuerlich unbrauchbar.
Antworten