gpt4 book ai didi

python - pybind11:表示与可选数据的 union

转载 作者:行者123 更新时间:2023-12-01 06:52:02 25 4
gpt4 key购买 nike

我的结构如下所示:

/// Enumeration describing register data types.
typedef enum RegDataType
{
RegDataType_Unknown = 0x0, ///< Unknown register data type.
RegDataType_ImmMultiData = 0x1, ///< Register data type is consecutive register values from a single offset.
RegDataType_ImmMultiPairs = 0x2, ///< Register data type is register offset and value pairs.
RegDataType_IndirectData = 0x3, ///< Register data type is consecutive register values from a single offset at
/// a specified address.
RegDataType_IndirectPairs = 0x4, ///< Register data type is register offset and value pairs at a specified
/// address.
} RegDataType;


/// Structure representing a register data pair of offset and value.
typedef struct PktRegDataPair
{
uint32_t offset; ///< The register offset.
uint32_t value; ///< The register value.
} PktRegDataPair;

/// Structure representing different types of register data that can be found within a packet.
typedef struct PktRegData
{
RegDataType type; ///< Register data type.
uint32_t numRegs; ///< The number of register represented.

union
{
struct
{
uint32_t regOffset; ///< Starting register offset.
const uint32_t* pData; ///< Pointer to consecutive register values.
} immMultiData;

struct
{
const PktRegDataPair* pData; ///< Pointer to register pairs of offsets/values.
} immMultiPairs;

struct
{
uint64_t address; ///< Address of consecutive register values/pairs of offsets/values.
uint32_t addrOffset; ///< Offset to an existing address. Valid only if address above is zero.
struct
{
uint32_t regOffset; ///< Starting register offset.
} data;
} indirect;
};
} PktRegData;

我想将其包装在 pybind11 中,以便当结构返回到 Python 时,仅存在有效的成员变量。同样,当从 Python 加载时,我需要将其转换为 PktRegData 结构。

我不知道在 pybind11 中执行此操作的最佳方法。我看过 custom type casters 的文档和 polymorphic type hooks ,但我不确定哪一个最适合我的用例。

感谢您的帮助!

最佳答案

您有一堆未定义的类型,并且没有指定哪些类型组合是有效的,因此无法创建一个运行示例,但也许下面的代码可以帮助您开始。

这个想法是使用一个属性来表示数据,这样你就可以得到一个钩子(Hook),并在表示方面做任何你想做的事情(我在下面充实了阅读方面,写作方面是类似的)。在钩子(Hook)中,创建一个占位符对象,检查 union 体的哪些成员是有效的,然后根据需要填充占位符的属性。

#include <pybind11/pybind11.h>
#include <pybind11/pytypes.h>
#include "PktRegData.h"

namespace py = pybind11;

struct PyRegData {}; // placeholder

PYBIND11_MODULE(PktRegData, m)
{
py::class_<PyRegData>(m, "RegData", py::dynamic_attr())
.def(pybind11::init<>());

py::class_<PktRegData>(m, "PktRegData")
.def(pybind11::init<>())
.def_property("data", [](PktRegData &d) -> pybind11::object {
auto this_mod = py::module::import("PktRegData");
py::object data_type = this_mod.attr("RegData");
py::object data_obj = data_type();

if (d.type == ...) {
// just one example of setting properties
data_obj.attr("regOffset") = py::cast(d.immMultiData.regOffset);
} else if (d.type == ...) {
...
}

return data_obj;
}, [](PktRegData& d) {});
}

上面的代码遵循您的“仅存在有效的成员变量”。就我个人而言,如果访问当前无效的属性,我会将所有数据成员绑定(bind)为属性,并简单地引发 ValueError (或 AttributeError 以更接近您的设计)。

关于python - pybind11:表示与可选数据的 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58944271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com