es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no funciona `import lib.reload()` para `itertools.count`?

Quiero volver a cargar itertools para recargar la función count. Esto es lo que obtuve de mi Mac (M1-air).

import itertools
for x in itertools.count(3,2):
  if x>30:
    break
  print(x)

funciona bien

3 5 7 9 11 13 15 17 19 21 23 25 27 29

itertools.count = 10
print(itertools.count) # 10

import importlib
importlib.reload(itertools)
print(itertools.count) # 10

En mi opinión, el último resultado 10 debería cambiarse a la función count original porque volví a cargar itertools con import lib.reload(itertools).

Siguiendo el enlace de uno de los comentarios, ahora veo que itertools es un paquete integrado y importlib.reload() no se aplica a paquetes integrados. Entonces, ¿cómo puedo volver a cargar un paquete integrado?

Es bastante natural pensar en una forma de revertir algo que hice por varias razones. (y también es de interés teórico buscar simetría si sabes a qué me refiero) Por ejemplo, git revert… Por supuesto, siempre puedo apartar una variable y usarla más tarde.

count = itertools.count

itertools.count = 10

<h1>luego más tarde</h1>

itertools.count = count
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no es posible recargar paquetes integrados como itertools utilizando importlib.reload(). Los paquetes integrados se cargan cuando se inicia Python por primera vez y no se pueden recargar. Por lo tanto, el último resultado 10 permanecerá incluso después de intentar recargar itertools.

    Si necesitas restablecer la funcionalidad original de la función count, podrías utilizar el enfoque que sugeriste y guardar temporalmente la función count original en una variable separada.

    import itertools
    
    count_original = itertools.count   # Guarda la función count original
    
    for x in count_original(3,2):      # Utiliza la función count original
      if x > 30:
        break
      print(x) 
    
    itertools.count = 10
    print(itertools.count)             # 10
    
    itertools.count = count_original   # Restablece itertools.count a la función original
    print(itertools.count)             # <itertools.count object="" at="" 0x7fc471146ed0="">
    

    Alternativamente, podrías reiniciar el intérprete de Python para restablecer todos los paquetes integrados a su estado original.</itertools.count>

Comments are closed.