-3

c++类型结构示例:

Struct xyz {
   uint64_t a;
   uint32_t b;
   uint16_t c;
   bool     d;
   char     e;
} var;

我可以在哪里使用var.a = 1; var.b = 2,等等...

在这里,我有一个数组来初始化这个结构,比如获取一个 python 列表:

values = [0x64, 0x32, 0x16, true, 'a'];

我需要将此列表值映射到结构元素,以便可以使用 var.a 访问它,如果 print var.a 它应该打印 0x64

请建议如何以最有效的方式在 python 中实现整个场景。我已经实现如下:

Class xyz(Structure):
   __field__ [ 
               (a, c_uint64, 64),
               (b, c_uint32, 32),
               (c, c_uint16, 16),
               (d, c_bool),
               (e, c_char)
             ]
    def __init__(self, p, q, r, s, t):
        self.a = p
        self.b = q
        self.c = r
        self.d = s
        self.e = t

obj = xyz(10, 11, 12, True, 'R')

它工作正常,无论这是正确的用法还是有更好的选择。这也给了我对 bi 字段的特权,可能是我需要 14 位的 int 的情况。

4

1 回答 1

3

在 Python 中,我们倾向于使用类来代替结构(假设您正在寻找创建结构,以便可以将相关数据捆绑在一个数据结构中)

class xyz(object):
    def __init__(self, a, b, c, d, e):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.e = e

>>> my_var = xyz(0x64, 0x32, 0x16, True, 'a')
>>> print my_var.a
100

如果这太冗长,您可以尝试使用namedtuples,它在一行代码中创建类和元组之间的一种混搭

>>> from collections import namedtuple
>>> xyz = namedtuple('xyz', ['a', 'b', 'c', 'd', 'e'])  # Creates an 'xyz' class
>>> my_var = xyz(0x64, 0x32, 0x16, True, 'a')  # Creates an instance of that class
>>> print my_var.a
100

如果要将元素列表映射到类,可以执行以下操作(使用类或命名元组):

>>> vars = [0x64, 0x32, 0x16, True, 'a']
>>> my_var = xyz(*vars)
>>> print my_var.a
100

Python 中确实没有类似于 C 的类型检查。类中的成员没有任何类型的固有类型——它们更像是可以放置任意数据类型的盒子。(C 是静态的,但是是弱类型的,而 Python 是动态的,但是是强类型的)。

我想你可以结合使用属性和装饰器来创建你自己的类型检查,但在绝大多数情况下,这太过分了。


如果您想创建一个结构,以便在 Python 值和 C 结构之间进行字面转换以操作二进制数据,请考虑使用struct模块,它允许您创建和操作专门用于互操作性的 c 样式结构。

如果您只是在寻找简单组织和封装代码的方法,那么 struct 模块将不是一个好的选择。

于 2013-11-14T18:45:13.220 回答