ipaddress: lru_cache on instance methods causes memory leak (use cached_property instead)
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 35.9k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Bug report
Bug description:
Lib/ipaddress.py uses @functools.lru_cache() on four instance method properties:
IPv4Address.is_private(line 1321)IPv4Address.is_global(line 1343)IPv4Network.is_private(line 1552)IPv6Address.is_private(line 2089)
Using lru_cache on instance methods causes a memory leak: the global cache holds
a reference to self, preventing garbage collection even after all other references
to the instance are dropped.
This can be demonstrated with:
import ipaddress, gc, weakref
a = ipaddress.IPv4Address('192.168.1.1')
ref = weakref.ref(a)
a.is_private # trigger the cache
del a
gc.collect()
print(ref() is not None) # True — instance is NOT collected (leak!)
The same file already uses @functools.cached_property for other properties
(e.g. with_prefixlen, compressed), which correctly ties cache lifetime to
the instance. Those do not leak:
n = ipaddress.IPv4Network('192.168.1.0/24')
ref = weakref.ref(n)
_ = n.with_prefixlen
del n
gc.collect()
print(ref() is not None) # False — correctly collected
Fix: Replace @functools.lru_cache() with @functools.cached_property on
the four affected properties.
I would like to work on a fix for this issue.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
- gh-152790
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Lee las cuatro propiedades afectadas en Lib/ipaddress.py y compáralas con los usos existentes de cached_property en ese archivo. Confirma el cambio con los ejemplos de weakref y recolección de basura para que las cuatro instancias de direcciones y redes puedan recolectarse después de eliminar sus referencias.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- backend
- Tipo de issue
- Error
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Estado de actividad
- Estancado
- Claridad
- Bien especificado
- Aptitud para principiantes
- 35/100