当前位置: 首页 > 知识库问答 >
问题:

我可以在没有大if/elif/elif/…的情况下编写操作码上的程序逻辑吗。。。块[副本]

荆乐
2023-03-14

让我用一些代码更好地解释一下。

class Opcode (Enum):
    WEEK=    1
    EMAIL=   2
    NAME=    3
    DOB=     4

然后我有一个参数类,它处理服务器接收的数据,并将其存储在适当的变量中:

class parameters:
    week = None
    email = None
    name = None
    dob = None
    
    def __init__(self, conn):
        #some initialization stuff, irrelevant
        
    def process_input(self, opcode, data):
        if opcode == Opcode.WEEK.value:
            self.week = data
            
        elif opcode == Opcode.EMAIL.value:
            self.email= data
         
        elif opcode == Opcode.NAME.value:
            self.name= data

        elif opcode == Opcode.DOB.value:
            self.dob= data
         .
         .
         .
 
        else :
            print("unknown opcode provided. disconnecting ... ")
            #disconnect from client ...

如果只有4个操作码,这看起来并不太糟糕,但实际上我的程序有12个操作码,所以这个长如果。。。埃利夫。。。埃利夫。。。else分支似乎是处理输入的一种糟糕方式。我习惯于使用C语言,在这种情况下,我会使用一个switch case,但它们在python中似乎不是什么东西,所以也许有一个更好的解决方案我只是不知道。有什么建议吗?

共有1个答案

袁炳
2023-03-14

正如我在一篇评论中所建议的,使用字典可以避免出现一系列if/elif语句。它也将比执行它们更快(对于大量操作码),并且可以以一种使其主要由数据驱动的方式实现,因此非常容易扩展-只需向枚举添加更多值即可。

import enum

class Opcode(enum.IntEnum):
    WEEK = 1
    EMAIL = 2
    NAME = 3
    DOB = 4

# Create a dictionary mapping Opcode values to lowercase attribute names.
opcode_dict = {opcode.value: opcode.name.lower() for opcode in Opcode}
print(opcode_dict)


class Parameters:
    def __init__(self, conn):
        #some initialization stuff, irrelevant
        ...

    def process_input(self, opcode, data):
        try:
            setattr(self, opcode_dict[opcode], data)
        except KeyError:
            print("unknown opcode provided. disconnecting...")
            # Disconnect from client...

    def __repr__(self):
        pairs = ', '.join('{}={!r}'.format(attrname, getattr(self, attrname, None))
                                            for attrname in opcode_dict.values())
        return '{}({})'.format(type(self).__name__, pairs)


if __name__ == '__main__':

    import random

    params = Parameters(None)
    for opcode in Opcode:
        params.process_input(opcode, random.randint(1, 10))
        print(params)

    # Try a bogus opcode.
    params.process_input(42, random.randint(1, 10))

 类似资料:
  • 我使用javap将一个java类文件反汇编成程序集。那么,我可以在没有操作系统的情况下运行javap命令生成的汇编代码吗?

  • 我的代码是工作的,但是当我键入否,如果我想重试输入密码,它不工作;它只是进入输入密码行(第20行)。我尝试了多种方法来解决这个问题,但我就是做不到。

  • 本文向大家介绍Python if, elif, else,包括了Python if, elif, else的使用技巧和注意事项,需要的朋友参考一下 示例 在Python中,您可以定义一系列条件if,第一个条件用于elif其余条件,直到最后一个(可选)else用于其他条件条件未捕获的任何条件。 产出 Number is bigger than 2 使用else if代替elif会触发语法错误,因此是

  • 问题内容: 据我所知,没有主方法就无法执行,因为运行Java程序时。Java虚拟机将查找main方法。如果JVM无法找到main方法,它将显示运行时错误。线程main中的异常找不到main类。 但是我搜索了许多博客,其中一些人说,是的,如果Java程序中有静态块,则可以通过静态博客来完成,类加载器会在Java调用main()方法之前加载所有静态块! 真的有可能吗?它们的可用性如何? 问题答案: 现

  • 我读到Redux Thunk是管理异步操作/请求的可靠方法。通过其他操作来调度操作没有什么太大的关系。 调度同步动作怎么样?我不确定thunk方法的性能问题,但我是否可以在其他操作创建者内部调度操作而不在内部定义函数? 在我看来,使用redux thunk对于这种需要是不必要的。

  • if/then/elif/else构造具有多个else分支。 语法 (Syntax) F#编程语言中if/then/elif/else语句的语法是 - if expr then expr elif expr then expr elif expr then expr ... else expr 例子 (Example) let a : int32 = 100 (* che