首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中实现以下C代码?(类型定义、枚举和开关)

如何在Python中实现以下C代码?(类型定义、枚举和开关)
EN

Stack Overflow用户
提问于 2019-03-21 03:32:19
回答 2查看 182关注 0票数 0

我用C语言编写了以下部分代码:

代码语言:javascript
复制
typedef enum {
    CAN_NORMAL_MODE = 0x00,
    CAN_SLEEP_MODE = 0x01,
    CAN_INTERNAL_LOOPBACK_MODE = 0x02,
    CAN_LISTEN_ONLY_MODE = 0x03,
    CAN_CONFIGURATION_MODE = 0x04,
    CAN_EXTERNAL_LOOPBACK_MODE = 0x05,
    CAN_CLASSIC_MODE = 0x06,
    CAN_RESTRICTED_MODE = 0x07,
    CAN_INVALID_MODE = 0xFF
} CAN_OPERATION_MODE;

//more code here in the middle...

d = something 
switch (d) {
    case CAN_NORMAL_MODE:
        mode = CAN_NORMAL_MODE;
        break;
    case CAN_SLEEP_MODE:
        mode = CAN_SLEEP_MODE;
        break;
   // more cases here, not shown for readability
    default:
        mode = CAN_INVALID_MODE;
        break;
}

这里的d是我从其他来源读取的一个字节。switch语句在另一个函数中,还有更多代码,但我认为没有必要显示,因为它与这一部分无关。

我的问题是:出于某些原因,我正在尝试将这段代码翻译成Python,以便它在本质上与原始C代码相似(也就是说,我不希望Python代码完全不同,这样其他使用过原始C代码的人就可以轻松地理解和使用Python代码)。我不确定如何在Python语言中实现此代码片段中的功能,而不执行没完没了的if-elif...else语句。我认为应该有一种更简单的(pythonic)方法来实现它,但我不确定如何在Python中实现typedef、enum和switch语句。我已经阅读了一些实现enum子句的方法来创建一个以别名和值作为属性的类,如下所示:

代码语言:javascript
复制
class myClass():
    def __init__(self):
        self.CAN_NORMAL_MODE = 0x00
        self.CAN_SLEEP_MODE = 0x01
        self.CAN_INTERNAL_LOOPBACK_MODE = 0x02
    #etc

我还遇到了一种用Python实现switch语句的聪明方法,使用这样的函数(与我的实际问题没有任何关系,只是为了显示实现的结构):

代码语言:javascript
复制
def switch(argument):
    switcher = {
        1: "January",
        2: "February",
        3: "March",
        4: "April",
        5: "May",
        6: "June",
        7: "July",
        8: "August",
        9: "September",
        10: "October",
        11: "November",
        12: "December"
    }
    print switcher.get(argument, "Invalid month")

但我找不到一种简单易懂的方式将这两件事结合起来。谢谢你,祝你有愉快的一天!

EN

回答 2

Stack Overflow用户

发布于 2019-03-21 03:46:35

代码语言:javascript
复制
from enum import IntEnum

class CAN_OPERATION_MODE(IntEnum):
    NORMAL_MODE = 0x00
    SLEEP_MODE = 0x01
    INTERNAL_LOOPBACK_MODE = 0x02
    LISTEN_ONLY_MODE = 0x03
    CONFIGURATION_MODE = 0x04
    EXTERNAL_LOOPBACK_MODE = 0x05
    CLASSIC_MODE = 0x06
    RESTRICTED_MODE = 0x07
    INVALID_MODE = 0xFF

    @classmethod
    def _missing_(cls, value):
        return cls.INVALID_MODE

d = something
mode = CAN_OPERATION_MODE(d)

我还会从所有枚举名称中删除_MODE

票数 2
EN

Stack Overflow用户

发布于 2019-03-21 03:39:41

字典怎么样?您可以将每个值分配给相应的模式,然后调用它:

代码语言:javascript
复制
modes = {
    0x00 : 'CAN_NORMAL_MODE',
    0x01 : 'CAN_SLEEP_MODE',
    0x02 : 'CAN_INTERNAL_LOOPBACK_MODE',
    0x03 : 'CAN_LISTEN_ONLY_MODE',
    0x04 : 'CAN_CONFIGURATION_MODE',
    0x05 : 'CAN_EXTERNAL_LOOPBACK_MODE',
    0x06 : 'CAN_CLASSIC_MODE',
    0x07 : 'CAN_RESTRICTED_MODE',
    0xFF : 'CAN_INVALID_MODE'
}

d = something
mode = modes[d]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55268847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档