【发布时间】:2020-12-07 00:30:56
【问题描述】:
我正在尝试为给定值创建一个 switch 语句。该值是一个 16 位无符号数,我想跳转到相应的模式。每个模式都是一个十六进制字符串,但下划线表示通配符。例如,(0x1234 匹配 '1234' 和 '12_4' 但不匹配 '56_8')。虽然我只发布了这些模式的一个子集,但假设它们涵盖了 0x0000-0xFFFF 的整个范围。
patterns = {
'15__': foo,
'2__0': bar,
'8__0': baz,
...
}
...
def run(self, x: int) -> None:
# x to string (0x567f -> "567F")
x_str = str(hex(opcode))[2:].zfill(4).upper()
# Search for the matching pattern and execute the associated method
for pattern, instruction in patterns.items():
if all([x_str[i] == pattern[i] for i in range(len(pattern)) if pattern[i] != '_'):
instruction(x)
break
现在,这行得通。然而,它非常慢,并且违背了使用字典的目的,因为它只是遍历它。此外,由于它必须将 x 转换为字符串(带格式)然后检查该字符串与模式字符串,所以整个事情是一个巨大的瓶颈。我正在寻找一种方法,最好是让它更接近实际的查找表,如果我们不需要将 x 转换为字符串,则可以加分。
【问题讨论】:
标签: python switch-statement pattern-matching bit-manipulation