2

最近、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()

このコードは、文字列から他の辞書にマップする辞書である 1 つのパラメーターを受け入れる perform メソッドを提供する dbus サービスを作成します。このパラメーターは、文字列をバリアントにマップします。この形式を選択したのは、辞書の形式が次のとおりであるためです。

{
  "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)、問題はありません。何か案は?

4

1 に答える 1

0

どの部分に問題があるかわかりません。あなたの例に示すように、タイプはあるフォームから別のフォームに簡単にキャストできますdbus.Boolean(val)isinstance(value, dbus.Boolean)を使用して、値が整数ではなく dbus ブール値であるかどうかをテストすることもできます。

dbusPython ネイティブ型は、任意の言語で記述された 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
于 2011-04-26T15:03:38.730 に答える