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

jk9hmnmh  于 2023-03-05  发布在  Python
关注(0)|答案(2)|浏览(168)

在我们的工作流程中,我们有一些整数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?)将不胜感激。

58wvjzkj

58wvjzkj1#

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

67up9zun

67up9zun2#

通过共享公共文件,无需处理即可完成:* * 共享的. py**

#define my_table const struct entry my_table[]
#define statement_end() ;
#define frozenset(...) __VA_ARGS__

#if 0
def statement_end():
    return
#endif

my_table = {frozenset({"OK" , 0}), frozenset({"ERROR", 1}), frozenset({"UNKNOWN", -1})}

statement_end()

#undef my_table
#undef statement_end
#undef frozenset

将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

    • 主要. c**
#include <stdio.h>

struct entry {
    char *str;
    int n;
};

#include "shared.py"

int main()
{
    /*
     * Write here great code that create bi directional lookup
     * from array of entry struct.
     * Ideas can be taken from https://stackoverflow.com/questions/6669842/how-to-best-achieve-string-to-number-mapping-in-a-c-program
     */
 
     for (const struct entry * pair = my_table; (char *)pair != (char *)my_table + sizeof(my_table); pair++)
     {
         printf("str: %s. int: %d\n", pair->str, pair->n);
     }

    return 0;
}
    • 主文件. py**
import shared

# Write here great code that create bi directional lookup from set of frozensets, each one contain int and string
for pair in shared.my_table:
    print(pair)

相关问题