在我们的工作流程中,我们有一些整数ID字符串名称Map表(例如,状态/错误代码、硬件ID等),我们正在尝试找到用C和python为这些值编写双向查找库的最佳方法。<-> string name mappings (e.g., status/error codes, hardware IDs, etc.). We are trying to find the best way to write a bidirectional lookup library for these values in both C and 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枚举类是理想的。在C++方面,我认为我们仍然停留在枚举字符串Map的预处理技巧上。枚举接口会很好,但不是必需的。<->string mapping. The enum interface would be nice but not necessary.
- C++接口应在编译时读取表,以避免必须定位数据文件
查找表都很小,而且几乎不可能增长到足以让我们担心内存驻留的程度。我们实际上只关心找到一种好的干方式来存储和读取信息。我希望能够找到一种格式化数据表的方法,以便它可以被python和C++编译器解析(可能需要一些预处理器宏的帮助)。我们的团队中没有人有为C函数创建python绑定的经验,或者相反,所以如果可能的话,我们希望避免这种方法。但是如果这真的是最好的方法,关于如何最好地实现它的建议(痛饮,助推::Python?)将不胜感激。
2条答案
按热度按时间58wvjzkj1#
在其他SO答案中已经讨论了两种方法:
67up9zun2#
通过共享公共文件,无需处理即可完成:* * 共享的. py**
将www.example.com与Python一起使用时,所有以
#
开头的行都将被忽略,因为它们是Python注解。将其与C一起使用时,#if 0
中的Python代码将被忽略,#define
语句将生效shared.py used with Python, all lines starts with#
are ignored as they Python comments. When it used with C, the Python code in the#if 0
is ignored and the#define
statements take effect