#python #gtk #boolean #dbus #variant
#python #gtk #логический #dbus #вариант
Вопрос:
В последнее время я экспериментирую с dbus. Но, похоже, я не могу заставить свою службу dbus угадать правильные типы данных для логических значений. Рассмотрим следующий пример:
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()
Этот фрагмент кода создает службу dbus, которая предоставляет метод perform, который принимает один параметр, представляющий собой словарь, который отображает строки в другие словари, которые, в свою очередь, отображают строки в варианты. Я выбрал этот формат из-за формата, в котором находятся мои словари:
{
"key1": {
"type": ("tuple", "value")
},
"key2": {
"name": "John Doe",
"gender": "male",
"age": 23
},
"test": {
"true-property": True,
"false-property": False
}
}
Когда я передаю этот словарь через свой сервис, логические значения преобразуются в целые числа. На мой взгляд, проверка не должна быть такой сложной. Рассмотрим это ( value
должна ли переменная быть преобразована в тип dbus):
if isinstance(value, bool):
return dbus.Boolean(value)
Если бы эта проверка была выполнена перед проверкой на isinstance(value, int)
, то проблем не было бы.
Есть идеи?
Ответ №1:
Я не уверен, с какой частью у вас возникли трудности. Типы могут быть легко переведены из одной формы в другую, как вы показываете в своем примере dbus.Boolean(val)
. Вы также можете использовать isinstance(value, dbus.Boolean)
для проверки, является ли значение логическим значением dbus, а не целым числом.
Собственные типы Python преобразуются в dbus
типы, чтобы обеспечить связь между клиентами DBus и службами, написанными на любом языке. Таким образом, любые данные, отправленные / полученные из службы DBus, будут состоять из 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
Вывод:
true-property type: <type 'dbus.Boolean'>
is dbus.Boolean: True
Python: True
Dbus: 1
false-property type: <type 'dbus.Boolean'>
is dbus.Boolean: True
Python: False
Dbus: 0
Комментарии:
1.Спасибо, ваш ответ привел меня к правильному решению. Я конвертирую типы dbus в еще один формат. В этом преобразовании использовалась проверка
isinstance(value, bool)
. Это должно сработать, ноdbus.Boolean
наследуется отint
, посколькуbool
не может быть подклассом. Мне просто нужно было адаптировать преобразование для проверкиdbus.Boolean
экземпляра.