减少冗余if语句?

  • 本文关键字:语句 if 冗余 python
  • 更新时间 :
  • 英文 :

@functools.cached_property
def dependencies(self):
"""
Get a list of dependencies.
"""
number_of_dependencies = int.from_bytes(
self.__data[
self.__dependency_table_offset : self.__dependency_table_offset + 4
],
byteorder="big",
signed=True,
)
dependencies = self.__data[self.__dependency_table_offset :]
dependency_list = []
offset = 0x4
guid, sha1_hash = helpers.get_resource_descriptor(self.__head_revision)
for i in range(number_of_dependencies):
if dependencies[offset:][0] == sha1_hash:
dependency_list.append(
(
"h"
+ str(
int.from_bytes(
dependencies[offset + 0x1 : offset + 0x15],
byteorder="big",
signed=True,
)
),
int.from_bytes(
dependencies[offset + 0x15 : offset + 0x19],
byteorder="big",
signed=True,
),
)
)
offset += 0x19
elif dependencies[offset:][0] == guid:
dependency_list.append(
(
"g"
+ str(
int.from_bytes(
dependencies[offset + 0x1 : offset + 0x5],
byteorder="big",
signed=True,
)
),
int.from_bytes(
dependencies[offset + 0x5 : offset + 0x9],
byteorder="big",
signed=True,
),
)
)
offset += 0x9
return dependency_list

我试图使我的代码更可读和紧凑,我想知道是否有一种方法,而不是当追加到dependencies_list,只做一个追加基于它是否是一个散列或guid而不是if/elif语句。有没有减少代码量的方法?它看起来有点臃肿,因此可读性较差。如果有人有任何关于减少这种东西的建议,我将不胜感激。另外,我使用的是Python 3.8,所以我不能使用match case。

注意,这可能更适合代码审查堆栈交换。然而,有一种想法是只提出不同的位,将循环更改为如下内容:

for i in range(num_dependencies):
dep_id = dependencies[offset:][0]
if dep_id == sha1_hash:
code = 'h'
n1 = dependencies[offset + 0x1 : offset + 0x15]
n2 = dependencies[offset + 0x15 : offset + 0x19]
inc = 0x19
elif dep_id == guid:
code = 'g'
n1 = dependencies[offset + 0x1 : offset + 0x5]
n2 = dependencies[offset + 0x5 : offset + 0x9]
inc = 0x9
else:
continue
dependency_list.append((
code + str(int.from_bytes(n1, byteorder="big", signed=True)),
int.from_bytes(n2, byteorder="big", signed=True),
))
offset += inc

这也有缩短你在一个语句中所做的工作量的效果,减少换行的数量和冗长的结果。

此外,这段代码看起来很适合struct.unpack——使用该库可能会紧凑得多。

最新更新