首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dbus-python如何获得本机类型的响应?

dbus-python如何获得本机类型的响应?
EN

Stack Overflow用户
提问于 2012-07-15 02:49:06
回答 3查看 2.5K关注 0票数 6

我正在使用dbus-python,我需要获得原生Python类型的响应(f.e dbus.Dictionary -但通常是任何响应)。是的,一个人可以写递归转换器,但我想我肯定遗漏了一些明显的东西?一定有办法使用dbus将这些怪兽转换回Python原生类型。或者不是?

代码语言:javascript
复制
dbus.Dictionary({dbus.String(u'CanGoNext'): dbus.Boolean(True, variant_level=1), dbus.String(u'CanPause'): dbus.String(u'MinimumRate'): dbus.Int32(14, variant_level=1) ...
EN

回答 3

Stack Overflow用户

发布于 2018-02-01 00:01:53

虽然Martin是对的,但它不能处理由python强制转换为int的布尔值(从bool cannot be subclassed开始)。

代码语言:javascript
复制
In [3]: print(dbus.Boolean(False))
0

不幸的是,递归转换器是保存布尔值的唯一方法。

下面是一个实现示例:

代码语言:javascript
复制
import dbus


def python_to_dbus(data):
    '''
        convert python data types to dbus data types
    '''
    if isinstance(data, str):
        data = dbus.String(data)
    elif isinstance(data, bool):
        # python bools are also ints, order is important !
        data = dbus.Boolean(data)
    elif isinstance(data, int):
        data = dbus.Int64(data)
    elif isinstance(data, float):
        data = dbus.Double(data)
    elif isinstance(data, list):
        data = dbus.Array([python_to_dbus(value) for value in data], signature='v')
    elif isinstance(data, dict):
        data = dbus.Dictionary(data, signature='sv')
        for key in data.keys():
            data[key] = python_to_dbus(data[key])
    return data


def dbus_to_python(data):
    '''
        convert dbus data types to python native data types
    '''
    if isinstance(data, dbus.String):
        data = str(data)
    elif isinstance(data, dbus.Boolean):
        data = bool(data)
    elif isinstance(data, dbus.Int64):
        data = int(data)
    elif isinstance(data, dbus.Double):
        data = float(data)
    elif isinstance(data, dbus.Array):
        data = [dbus_to_python(value) for value in data]
    elif isinstance(data, dbus.Dictionary):
        new_data = dict()
        for key in data.keys():
            new_data[key] = dbus_to_python(data[key])
        data = new_data
    return data

为了使其更易于在处理源自dbus的数据的类中使用,可以使用装饰器:

代码语言:javascript
复制
def convert_to_python(func):
    def wrapper(*args, **kwargs):
        return dbus_to_python(func(*args, **kwargs))
    return wrapper
...

@convert_to_python
def dbus_method_call(self):
    return self.dbus_proxy.Method()

这样,上面由dbus_method_call返回的任何数据都将被转换为原生python。

请参阅此相关问题:dbus Variant: How to preserve boolean datatype in Python?

票数 3
EN

Stack Overflow用户

发布于 2012-09-27 23:27:17

你不需要这么做。它们是本机类型的子类,所以您只需像使用本机类型一样使用它们:

代码语言:javascript
复制
>>> import dbus
>>> v = dbus.Dictionary({dbus.String(u'CanGoNext'): dbus.Boolean(True, variant_level=1), dbus.String(u'CanPause'): dbus.Boolean(False, variant_level=1), dbus.String(u'MinimumRate'): dbus.Int32(14, variant_level=1)})
>>> print v['MinimumRate']
14
>>> if v['CanGoNext']: print 'Go'
... 
Go
>>> if v['CanPause']: print 'Pause'
... 
>>> 
票数 1
EN

Stack Overflow用户

发布于 2012-09-27 23:45:54

在你的代码中,你不需要做任何事情就可以像@Martin Vidner说的那样使用它们。

要美观地打印,您可以使用现有的“递归转换器”,如json

代码语言:javascript
复制
import json
print(json.dumps(d, indent=2))

输出

代码语言:javascript
复制
{
  "MinimumRate": 14, 
  "CanGoNext": 1, 
  "CanPause": 0
}

它丢失了有关类型的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11486443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档