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

Python 我可以在没有大if/elif/elif/…的情况下编写操作码上的程序逻辑吗。。。块,python,Python,让我用一些代码更好地解释一下 class Opcode (Enum): WEEK= 1 EMAIL= 2 NAME= 3 DOB= 4 然后我有一个parameters类,它处理服务器接收的数据,并将其存储在适当的变量中: class parameters: week = None email = None name = None dob = None def __init__(self,

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

class Opcode (Enum):
    WEEK=    1
    EMAIL=   2
    NAME=    3
    DOB=     4
然后我有一个parameters类,它处理服务器接收的数据,并将其存储在适当的变量中:

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个操作码,因此这个长的
if…elif…elif…else
分支似乎是处理输入的一种糟糕方式。我习惯于使用C++,在这种情况下,我使用了一个交换的情况,但是在Python中它们似乎不是一个东西,所以也许有一个更好的解决方案我不知道。有什么建议吗?

正如我在评论中所建议的那样,使用字典可以避免一系列
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))

使用字典来摆脱
if
/
elif
。这和它有什么关系是个谜。martineau!你不知道你有多大的帮助。非常感谢您的后续回答,我一定会实施它。jf192210:不客气。请注意,
\u repr\uu()
方法是严格可选的,只是为了使类的打印实例更具信息性。啊,无论如何,我都非常喜欢它,所以我会保留它以便更整洁地调试