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()
方法是严格可选的,只是为了使类的打印实例更具信息性。啊,无论如何,我都非常喜欢它,所以我会保留它以便更整洁地调试