首页 > 解决方案 > python 和 C++ 中的高效、DRY 双向查找

问题描述

在我们的工作流程中,我们有几个整数 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

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

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

标签: pythonc++enumsbidirectional

解决方案


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


推荐阅读