2 Stimmen

Dbus Variant: Wie lässt sich der boolesche Datentyp in Python erhalten?

Ich habe in letzter Zeit mit dbus experimentiert. Aber anscheinend bekomme ich meinen dbus-Dienst nicht dazu, die richtigen Datentypen für boolesche Werte zu erraten. Betrachten Sie das folgende Beispiel:

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

class Service(dbus.service.Object):

  def __init__(self):
    bus_name = dbus.service.BusName("org.foo.bar", bus = dbus.SessionBus())
    dbus.service.Object.__init__(self, bus_name, "/org/foo/bar")

  @dbus.service.method("org.foo.bar", in_signature = "a{sa{sv}}",
    out_signature = "a{sa{sv}}")
  def perform(self, data):   
    return data

if __name__ == "__main__":
  DBusGMainLoop(set_as_default = True)
  s = Service()
  gtk.main()

Dieser Code erstellt einen dbus-Dienst, der die Methode "perform" bereitstellt, die ein Parameter akzeptiert, der ein Wörterbuch ist, das von Zeichenfolgen zu anderen Wörterbüchern abgebildet wird, die wiederum Zeichenfolgen zu Varianten abbilden. Ich habe dieses Format gewählt, weil meine Wörterbücher in diesem Format vorliegen:

{
  "key1": {
    "type": ("tuple", "value")
  },
  "key2": {
    "name": "John Doe",
    "gender": "male",
    "age": 23
  },
  "test": {
    "true-property": True,
    "false-property": False
  }
}

Wenn ich dieses Wörterbuch durch meinen Dienst schicke, werden die booleschen Werte in Ganzzahlen umgewandelt. Meiner Meinung nach sollte die Überprüfung nicht so schwierig sein. Betrachten Sie dies (value ist die Variable, die in einen dbus-Typ konvertiert werden soll):

if isinstance(value, bool):
  return dbus.Boolean(value)

Wenn diese Überprüfung vor der Überprüfung auf isinstance(value, int) erfolgt, sollte es kein Problem geben. Irgendwelche Ideen?

0voto

samplebias Punkte 35688

Ich bin mir nicht sicher, mit welchem Teil du Schwierigkeiten hast. Die Typen können leicht von einer Form in eine andere überführt werden, wie du in deinem Beispiel dbus.Boolean(val) zeigst. Du kannst auch isinstance(value, dbus.Boolean) verwenden, um zu prüfen, ob der Wert ein dbus-Boolean ist, und kein Integer.

Die nativen Python-Typen werden in dbus-Typen umgewandelt, um die Kommunikation zwischen DBus-Clients und Services, die in jeder Sprache geschrieben sind, zu ermöglichen. Daher werden alle Daten, die an einen DBus-Service gesendet / von ihm empfangen werden, aus dbus.*-Datentypen bestehen.

def perform(self, data):
    for key in ['true-property', 'false-property']:
        val = data['test'][key]
        newval = bool(val)

        print '%s Typ: %s' % (key, type(val))
        print 'ist dbus.Boolean: %s' % isinstance(val, dbus.Boolean)
        print 'Python:', newval
        print '  Dbus:', dbus.Boolean(newval)
    return data

Ausgabe:

true-property Typ: 
ist dbus.Boolean: True
Python: True
  Dbus: 1
false-property Typ: 
ist dbus.Boolean: True
Python: False
  Dbus: 0

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X