Variante de dbus: ¿Cómo conservar el tipo de datos booleano en Python?

He estado experimentando con dbus últimamente. Pero parece que no puedo hacer que mi servicio de dbus adivine los tipos de datos correctos para los valores booleanos. Considere el siguiente ejemplo:

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() 

Este fragmento de código crea un servicio dbus que proporciona el método de ejecución que acepta un parámetro que es un diccionario que se asigna de cadenas a otros diccionarios, que a su vez asigna cadenas a variantes. He elegido este formato debido al formato en que están mis diccionarios:

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

Cuando paso este diccionario a través de mi servicio, los valores booleanos se convierten en enteros. A mis ojos, el cheque no debería ser tan difícil. Considere esto (el value es la variable a convertir en un tipo de dbus):

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

Si esta comprobación se realiza antes de verificar la isinstance(value, int) entonces no habrá ningún problema. ¿Algunas ideas?

No estoy seguro de con qué parte estás teniendo dificultades. Los tipos se pueden convertir fácilmente de una forma a otra, como se muestra en su ejemplo dbus.Boolean(val) . También puede usar isinstance(value, dbus.Boolean) para probar si el valor es un dbus booleano, no un entero.

Los tipos nativos de Python se convierten en tipos de dbus para permitir la comunicación entre clientes DBus y servicios escritos en cualquier idioma. Por lo tanto, cualquier dato enviado / recibido desde un servicio DBus consistirá en tipos de datos dbus.* .

 def perform(self, data): for key in ['true-property', 'false-property']: val = data['test'][key] newval = bool(val) print '%s type: %s' % (key, type(val)) print 'is dbus.Boolean: %s' % isinstance(val, dbus.Boolean) print 'Python:', newval print ' Dbus:', dbus.Boolean(newval) return data 

Salida:

 true-property type:  is dbus.Boolean: True Python: True Dbus: 1 false-property type:  is dbus.Boolean: True Python: False Dbus: 0