3 votes

Pourquoi os.remove est None après l'exécution de pytest ?

Je crée une classe LazyLoader qui télécharge des fichiers depuis S3 vers le système de fichiers local, mais seulement s'ils n'ont pas été téléchargés auparavant. Cette classe supprime les éléments qu'elle a téléchargés une fois qu'ils sont détruits :

def __del__(self):
    """Remove downloaded files when this object is deleted."""
    for downloaded_file in self.loaded_data.values():
        os.remove(downloaded_file)

Les tests passent, mais après que pytest m'ait dit que les tests ont passé, j'obtiens :

Exception ignored in: <bound method LazyLoader.__del__ of LazyLoader({})>
Traceback (most recent call last):
  File "my_lazy_loader.py", line 47, in __del__
TypeError: 'NoneType' object is not callable

La ligne 47 est os.remove(downloaded_file) . Donc os.remove is None évalue à True . Pourquoi ? Comment je peux arranger ça ?

Si je déplace le code dans __del__ à une méthode clean() je n'ai pas ce problème.

0voto

balderman Points 12404

https://docs.python.org/3/reference/datamodel.html#object. del

' del ()' peut être exécuté pendant l'arrêt de l'interpréteur. Par conséquent, les variables globales auxquelles il doit accéder (y compris les autres modules) peuvent déjà avoir été supprimées ou mises à None. . Python garantit que les globaux dont le nom commence par un seul trait de soulignement sont supprimés de leur module avant que les autres globaux ne soient supprimés ; si aucune autre référence à ces globaux n'existe, cela peut aider à garantir que les modules importés sont toujours disponibles au moment où la fonction del () est appelée.

0voto

asikorski Points 729
  • S'il s'agit uniquement de tests unitaires, utilisez tearDown méthode.

  • Si le problème survient lors de l'exécution de votre application et que vous souhaitez effectuer un nettoyage à la fin du programme, envisagez d'utiliser la commande atexit.register .

  • Vous pouvez également utiliser tempfile module pour les fichiers temporaires automatiquement supprimés à la fermeture.

  • Si votre cas d'utilisation le permet, tournez LazyLoader en un gestionnaire de contexte .

Si aucun des cas ci-dessus ne s'applique, il suffit d'appeler clean() explicitement. Il suivra l'explicite est meilleur que l'implicite règle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X