python 和 C++ 中高效的 DRY 双向查找

Efficient, DRY bi-directional lookup in both python and C++

在我们的工作流程中,我们有几个 table 整数 ID <-> 字符串名称映射(例如,status/error 代码、硬件 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

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

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

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