【问题标题】:Efficient, DRY bi-directional lookup in both python and C++python 和 C++ 中的高效、DRY 双向查找
【发布时间】:2021-02-03 18:51:06
【问题描述】:

在我们的工作流程中,我们有几个整数 ID 字符串名称映射表(例如,状态/错误代码、硬件 ID 等)。我们正在努力寻找在 C++ 和 python 中为这些值编写双向查找库的最佳方法。

界面可能看起来像


namespace myproject{
  namespace lookup{
    typedef long ID_t;

    enum class STATUSCODE :ID_t {OK=0, ERROR=1, UNKNOWN=-1}; 
    std::string GetStatusDescription(ID_t statuscode);
    ID_t GetStatusCode(const std::string& statusdesc);

    enum class DEVICELABEL :ID_t {SuperThing_v1=0x234, LessSuperThing_v12=0x12};
    std::string GetDeviceLabel(ID_t hardwareid);
    ID_t GetHardwareID(const std::string& devicelabel); 
  }
}
#file myproject/lookup.py
class STATUSCODE(Enum):
    OK=0
    ERROR=1
    UNKNOWN=-1

def GetStatusDescription(statuscode: int) -> str:
    pass

def GetStatusCode(statusdesc: str) -> int:
    pass


class DEVICELABEL(Enum):
    SuperThing_v1=0x234 
    LessSuperThing_v12=0x12

def GetDeviceLabel(hardwareid: int) -> str:
    pass

def GetHardwareID(devicelabel: str) -> int:
    pass

理想情况下,实现应满足以下所有条件:

  • 实际的表在单个文件中(或每个表一个文件,但没有像上例中的枚举那样重复)
  • 使用整数、字符串和枚举输入提供高效的双向查找。例如。 python Enum 类是理想的。在 C++ 方面,我认为我们仍然坚持使用 enumstring 映射的预处理器技巧。枚举接口会很好,但不是必需的。
  • C++ 接口应在编译时读取表以避免必须定位数据文件

查找表都很小,而且极不可能增长到足以让我们不得不担心驻留在内存中的程度。我们真的只关心找到一种好的 DRY 方式来存储和读取信息。我希望能够找到一种方法来格式化数据表,以便它可以被 python 和 C++ 编译器解析(可能在一些预处理器宏的帮助下)。 我们团队中没有人在为 C 函数或其他方式创建 python 绑定方面经验丰富,因此我们希望尽可能避免这条路线。但是,如果这确实是最好的方法,将不胜感激有关如何最好地实现它的建议(swig,boost::python?)。

【问题讨论】:

    标签: python c++ enums bidirectional


    【解决方案1】:

    其他 SO 答案中已经讨论了两种方法:

    【讨论】:

    • 我想问你用什么搜索词来找到这些帖子,但我知道你是作者。这正是我想要的
    • @thegreatemu:pythonenumheader,也许还有C 是很好的衡量标准。你认为你会使用哪种方法?
    • 让 python 生成 C 标头似乎是最简单的 - 让我将实际映射转换为数据格式(例如 CSV、JSON),而不是尝试解析 C 标头,这似乎很容易破解
    • @thegreatemu:有趣!您可能希望将我的 JSONEnumMeta 与 Arduino 问题中的 __init_subclass__ 方法结合使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多