Skip to content

Commit 6a85cbf

Browse files
authored
feat: reduce overhead to enumerate ip addresses in ServiceInfo (#1181)
1 parent 8b44947 commit 6a85cbf

1 file changed

Lines changed: 23 additions & 14 deletions

File tree

src/zeroconf/_services/info.py

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@
6363
_TYPE_TXT,
6464
)
6565

66+
_IPVersion_All_value = IPVersion.All.value
67+
_IPVersion_V4Only_value = IPVersion.V4Only.value
6668
# https://datatracker.ietf.org/doc/html/rfc6762#section-5.2
6769
# The most common case for calling ServiceInfo is from a
6870
# ServiceBrowser. After the first request we add a few random
@@ -245,14 +247,15 @@ def addresses_by_version(self, version: IPVersion) -> List[bytes]:
245247
This means the first address will always be the most recently added
246248
address of the given IP version.
247249
"""
248-
if version == IPVersion.V4Only:
250+
version_value = version.value
251+
if version_value == _IPVersion_All_value:
252+
return [
253+
*(addr.packed for addr in self._ipv4_addresses),
254+
*(addr.packed for addr in self._ipv6_addresses),
255+
]
256+
if version_value == _IPVersion_V4Only_value:
249257
return [addr.packed for addr in self._ipv4_addresses]
250-
if version == IPVersion.V6Only:
251-
return [addr.packed for addr in self._ipv6_addresses]
252-
return [
253-
*(addr.packed for addr in self._ipv4_addresses),
254-
*(addr.packed for addr in self._ipv6_addresses),
255-
]
258+
return [addr.packed for addr in self._ipv6_addresses]
256259

257260
def ip_addresses_by_version(
258261
self, version: IPVersion
@@ -265,11 +268,17 @@ def ip_addresses_by_version(
265268
This means the first address will always be the most recently added
266269
address of the given IP version.
267270
"""
268-
if version == IPVersion.V4Only:
271+
return self._ip_addresses_by_version_value(version.value)
272+
273+
def _ip_addresses_by_version_value(
274+
self, version_value: int
275+
) -> Union[List[ipaddress.IPv4Address], List[ipaddress.IPv6Address], List[ipaddress._BaseAddress]]:
276+
"""Backend for addresses_by_version that uses the raw value."""
277+
if version_value == _IPVersion_All_value:
278+
return [*self._ipv4_addresses, *self._ipv6_addresses]
279+
if version_value == _IPVersion_V4Only_value:
269280
return self._ipv4_addresses
270-
if version == IPVersion.V6Only:
271-
return self._ipv6_addresses
272-
return [*self._ipv4_addresses, *self._ipv6_addresses]
281+
return self._ipv6_addresses
273282

274283
def parsed_addresses(self, version: IPVersion = IPVersion.All) -> List[str]:
275284
"""List addresses in their parsed string form.
@@ -280,7 +289,7 @@ def parsed_addresses(self, version: IPVersion = IPVersion.All) -> List[str]:
280289
This means the first address will always be the most recently added
281290
address of the given IP version.
282291
"""
283-
return [str(addr) for addr in self.ip_addresses_by_version(version)]
292+
return [str(addr) for addr in self._ip_addresses_by_version_value(version.value)]
284293

285294
def parsed_scoped_addresses(self, version: IPVersion = IPVersion.All) -> List[str]:
286295
"""Equivalent to parsed_addresses, with the exception that IPv6 Link-Local
@@ -296,7 +305,7 @@ def parsed_scoped_addresses(self, version: IPVersion = IPVersion.All) -> List[st
296305
return self.parsed_addresses(version)
297306
return [
298307
f"{addr}%{self.interface_index}" if addr.version == 6 and addr.is_link_local else str(addr)
299-
for addr in self.ip_addresses_by_version(version)
308+
for addr in self._ip_addresses_by_version_value(version.value)
300309
]
301310

302311
def _set_properties(self, properties: Dict) -> None:
@@ -494,7 +503,7 @@ def dns_addresses(
494503
address.packed,
495504
created=created,
496505
)
497-
for address in self.ip_addresses_by_version(version)
506+
for address in self._ip_addresses_by_version_value(version.value)
498507
]
499508

500509
def dns_pointer(self, override_ttl: Optional[int] = None, created: Optional[float] = None) -> DNSPointer:

0 commit comments

Comments
 (0)