python - 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
理想情况下,实现将满足以下所有条件:
- 实际的表在一个文件中(或每个表一个文件,但没有像上面示例中的枚举那样重复)
- 使用整数、字符串和枚举输入提供高效的双向查找。例如,python Enum 类是理想的。在 C++ 方面,我认为我们仍然坚持使用 enum<->string 映射的预处理器技巧。枚举接口会很好但不是必需的。
- C++ 接口应在编译时读取表以避免必须定位数据文件
查找表都很小,而且极不可能增长到我们不得不担心驻留在内存中的程度。我们真的只关心找到一种好的 DRY 方式来存储和读取信息。我希望能够找到一种方法来格式化数据表,以便它可以被 python 和 C++ 编译器解析(可能在一些预处理器宏的帮助下)。我们团队中没有人在为 C 函数或其他方式创建 python 绑定方面经验丰富,因此我们希望尽可能避免使用这种方法。但是,如果这确实是最好的方法,那么关于如何最好地实现它的建议(swig,boost::python?)将不胜感激。
解决方案
其他 SO 答案中已经讨论了两种方法:
在 python 和 arduino 之间共享枚举 :从 Python 编写 C 文件
Python 可以从 C 头文件加载定义吗?: 解析 C 文件以创建 Python 值
推荐阅读
- dart - 为什么错误构造函数不返回错误?
- ssh - 为 gcloud cli 自动附加 ssh 标志
- fonts - XeLaTeX Nono 字体复制和粘贴失败
- powershell - 在powershell中获取大文件的md5校验和
- php - Symfony:表格中特定条件的数据获取方法
- javascript - 禁用材料表中的工具提示
- python - 每次使用苹果登录时,Django都会创建新用户
- python - 这个展平层在我的 LSTM 中做了什么?
- spring-boot - Cassandra数据库关闭时的Spring security-oauth2自定义异常
- html - “react-native-maps”中的 MapView 未正确加载