Skip to content

Commit 06c1926

Browse files
committed
Use frozensets for contains checks
1 parent d968aed commit 06c1926

File tree

1 file changed

+59
-51
lines changed

1 file changed

+59
-51
lines changed

src/betterproto/__init__.py

Lines changed: 59 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -65,35 +65,41 @@
6565

6666

6767
# Fields that use a fixed amount of space (4 or 8 bytes)
68-
FIXED_TYPES = [
69-
TYPE_FLOAT,
70-
TYPE_DOUBLE,
71-
TYPE_FIXED32,
72-
TYPE_SFIXED32,
73-
TYPE_FIXED64,
74-
TYPE_SFIXED64,
75-
]
68+
FIXED_TYPES = frozenset(
69+
{
70+
TYPE_FLOAT,
71+
TYPE_DOUBLE,
72+
TYPE_FIXED32,
73+
TYPE_SFIXED32,
74+
TYPE_FIXED64,
75+
TYPE_SFIXED64,
76+
}
77+
)
7678

7779
# Fields that are numerical 64-bit types
78-
INT_64_TYPES = [TYPE_INT64, TYPE_UINT64, TYPE_SINT64, TYPE_FIXED64, TYPE_SFIXED64]
79-
80-
# Fields that are efficiently packed when
81-
PACKED_TYPES = [
82-
TYPE_ENUM,
83-
TYPE_BOOL,
84-
TYPE_INT32,
85-
TYPE_INT64,
86-
TYPE_UINT32,
87-
TYPE_UINT64,
88-
TYPE_SINT32,
89-
TYPE_SINT64,
90-
TYPE_FLOAT,
91-
TYPE_DOUBLE,
92-
TYPE_FIXED32,
93-
TYPE_SFIXED32,
94-
TYPE_FIXED64,
95-
TYPE_SFIXED64,
96-
]
80+
INT_64_TYPES = frozenset(
81+
{TYPE_INT64, TYPE_UINT64, TYPE_SINT64, TYPE_FIXED64, TYPE_SFIXED64}
82+
)
83+
84+
# Fields that are efficiently packed when serialised
85+
PACKED_TYPES = frozenset(
86+
{
87+
TYPE_ENUM,
88+
TYPE_BOOL,
89+
TYPE_INT32,
90+
TYPE_INT64,
91+
TYPE_UINT32,
92+
TYPE_UINT64,
93+
TYPE_SINT32,
94+
TYPE_SINT64,
95+
TYPE_FLOAT,
96+
TYPE_DOUBLE,
97+
TYPE_FIXED32,
98+
TYPE_SFIXED32,
99+
TYPE_FIXED64,
100+
TYPE_SFIXED64,
101+
}
102+
)
97103

98104
# Wire types
99105
# https://developers.google.com/protocol-buffers/docs/encoding#structure
@@ -103,20 +109,22 @@
103109
WIRE_FIXED_32 = 5
104110

105111
# Mappings of which Proto 3 types correspond to which wire types.
106-
WIRE_VARINT_TYPES = [
107-
TYPE_ENUM,
108-
TYPE_BOOL,
109-
TYPE_INT32,
110-
TYPE_INT64,
111-
TYPE_UINT32,
112-
TYPE_UINT64,
113-
TYPE_SINT32,
114-
TYPE_SINT64,
115-
]
116-
117-
WIRE_FIXED_32_TYPES = [TYPE_FLOAT, TYPE_FIXED32, TYPE_SFIXED32]
118-
WIRE_FIXED_64_TYPES = [TYPE_DOUBLE, TYPE_FIXED64, TYPE_SFIXED64]
119-
WIRE_LEN_DELIM_TYPES = [TYPE_STRING, TYPE_BYTES, TYPE_MESSAGE, TYPE_MAP]
112+
WIRE_VARINT_TYPES = frozenset(
113+
{
114+
TYPE_ENUM,
115+
TYPE_BOOL,
116+
TYPE_INT32,
117+
TYPE_INT64,
118+
TYPE_UINT32,
119+
TYPE_UINT64,
120+
TYPE_SINT32,
121+
TYPE_SINT64,
122+
}
123+
)
124+
125+
WIRE_FIXED_32_TYPES = frozenset({TYPE_FLOAT, TYPE_FIXED32, TYPE_SFIXED32})
126+
WIRE_FIXED_64_TYPES = frozenset({TYPE_DOUBLE, TYPE_FIXED64, TYPE_SFIXED64})
127+
WIRE_LEN_DELIM_TYPES = frozenset({TYPE_STRING, TYPE_BYTES, TYPE_MESSAGE, TYPE_MAP})
120128

121129

122130
# Protobuf datetimes start at the Unix Epoch in 1970 in UTC.
@@ -358,16 +366,16 @@ def encode_varint(value: int) -> bytes:
358366

359367
def _preprocess_single(proto_type: str, wraps: str, value: Any) -> bytes:
360368
"""Adjusts values before serialization."""
361-
if proto_type in (
369+
if proto_type in {
362370
TYPE_ENUM,
363371
TYPE_BOOL,
364372
TYPE_INT32,
365373
TYPE_INT64,
366374
TYPE_UINT32,
367375
TYPE_UINT64,
368-
):
376+
}:
369377
return encode_varint(value)
370-
elif proto_type in (TYPE_SINT32, TYPE_SINT64):
378+
elif proto_type in {TYPE_SINT32, TYPE_SINT64}:
371379
# Handle zig-zag encoding.
372380
return encode_varint(value << 1 if value >= 0 else (value << 1) ^ (~0))
373381
elif proto_type in FIXED_TYPES:
@@ -917,18 +925,18 @@ def _postprocess_single(
917925
) -> Any:
918926
"""Adjusts values after parsing."""
919927
if wire_type == WIRE_VARINT:
920-
if meta.proto_type in (TYPE_INT32, TYPE_INT64):
928+
if meta.proto_type in {TYPE_INT32, TYPE_INT64}:
921929
bits = int(meta.proto_type[3:])
922930
value = value & ((1 << bits) - 1)
923931
signbit = 1 << (bits - 1)
924932
value = int((value ^ signbit) - signbit)
925-
elif meta.proto_type in (TYPE_SINT32, TYPE_SINT64):
933+
elif meta.proto_type in {TYPE_SINT32, TYPE_SINT64}:
926934
# Undo zig-zag encoding
927935
value = (value >> 1) ^ (-(value & 1))
928936
elif meta.proto_type == TYPE_BOOL:
929937
# Booleans use a varint encoding, so convert it to true/false.
930938
value = value > 0
931-
elif wire_type in (WIRE_FIXED_32, WIRE_FIXED_64):
939+
elif wire_type in {WIRE_FIXED_32, WIRE_FIXED_64}:
932940
fmt = _pack_fmt(meta.proto_type)
933941
value = struct.unpack(fmt, value)[0]
934942
elif wire_type == WIRE_LEN_DELIM:
@@ -992,10 +1000,10 @@ def parse(self: T, data: bytes) -> T:
9921000
pos = 0
9931001
value = []
9941002
while pos < len(parsed.value):
995-
if meta.proto_type in (TYPE_FLOAT, TYPE_FIXED32, TYPE_SFIXED32):
1003+
if meta.proto_type in {TYPE_FLOAT, TYPE_FIXED32, TYPE_SFIXED32}:
9961004
decoded, pos = parsed.value[pos : pos + 4], pos + 4
9971005
wire_type = WIRE_FIXED_32
998-
elif meta.proto_type in (TYPE_DOUBLE, TYPE_FIXED64, TYPE_SFIXED64):
1006+
elif meta.proto_type in {TYPE_DOUBLE, TYPE_FIXED64, TYPE_SFIXED64}:
9991007
decoded, pos = parsed.value[pos : pos + 8], pos + 8
10001008
wire_type = WIRE_FIXED_64
10011009
else:
@@ -1169,7 +1177,7 @@ def to_dict(
11691177
else:
11701178
enum_class = field_types[field_name] # noqa
11711179
output[cased_name] = enum_class(value).name
1172-
elif meta.proto_type in (TYPE_FLOAT, TYPE_DOUBLE):
1180+
elif meta.proto_type in {TYPE_FLOAT, TYPE_DOUBLE}:
11731181
if field_is_repeated:
11741182
output[cased_name] = [_dump_float(n) for n in value]
11751183
else:
@@ -1373,7 +1381,7 @@ def to_timedelta(self) -> timedelta:
13731381
def delta_to_json(delta: timedelta) -> str:
13741382
parts = str(delta.total_seconds()).split(".")
13751383
if len(parts) > 1:
1376-
while len(parts[1]) not in (3, 6, 9):
1384+
while len(parts[1]) not in {3, 6, 9}:
13771385
parts[1] = f"{parts[1]}0"
13781386
return f"{'.'.join(parts)}s"
13791387

0 commit comments

Comments
 (0)