Je viens de commencer avec python il y a quelques jours, venant d'un arrière-plan C ++. Lorsque j'écris une classe, l'appelle par un script et que je mets à jour l'interface de la classe, j'ai un comportement que je trouve très peu intuitif.

Une fois compilée avec succès, la classe ne semble plus être modifiable. Voici un exemple:

TestModule.py:

class testClass:
    def __init__(self,_A):
        self.First=_A

    def Method(self, X, Y):
        print X

TestScript.py:

import testModule

tm=testModuleB.testClass(10)
tm.Method(3, 4)

L'exécution me donne

3

Maintenant, je change la liste d'arguments de Method:

def Method(self, X):

, Je supprime le testModule.pyc et dans mon script j'appelle

tm.Method(3)

En conséquence, je reçois

TypeError: Method() takes exactly 3 arguments (2 given)

Qu'est-ce que je fais mal? Pourquoi le script n'utilise-t-il pas la version mise à jour de la classe? J'utilise l'éditeur Canopy mais j'ai vu ce comportement également avec l'interpréteur python.exe.

Et excuses, si quelque chose de similaire a été demandé auparavant. Je n'ai pas trouvé de question liée à celle-ci.

1
Indy625 14 juil. 2015 à 12:37

3 réponses

Meilleure réponse

Python charge les objets de code en mémoire; l'instruction class est exécutée lorsqu'un fichier est importé pour la première fois et qu'un objet de classe est créé et stocké dans l'espace de noms du module. Les importations suivantes réutilisent les objets déjà créés.

Le fichier .pyc n'est utilisé que la prochaine fois où le module est importé pour la première fois que la session Python . Le remplacement du fichier n'entraînera pas un rechargement du module.

Vous pouvez utiliser la reload() fonction pour forcer Python à remplacer un module déjà chargé avec du code frais à partir du disque. Notez que toutes les autres références directes à une classe ne sont pas remplacées; une instance de la classe testClass (tm dans votre cas) ferait toujours référence à l'ancien objet de classe.

Lors du développement de code, il est souvent plus facile de redémarrer l'interpréteur Python et de recommencer. De cette façon, vous n'avez pas à vous soucier de rechercher toutes les références directes et de les remplacer, par exemple.

2
Martijn Pieters 14 juil. 2015 à 09:43

testModule est déjà chargé dans votre interprète. La suppression du fichier pyc ne changera rien. Vous devrez faire reload(testModule), ou encore mieux redémarrer l'interpréteur.

2
Daniel Roseman 14 juil. 2015 à 09:40

La suppression du fichier .pyc ne peut pas effectuer la modification dans votre cas. Lorsque vous importez un module pour la première fois sur l'interpréteur, il est complètement chargé sur l'interpréteur et la suppression des fichiers ou la modification ne changera rien.

Mieux vaut redémarrer l'interpréteur ou utiliser la fonction intégrée reload.

-1
Himanshu Mishra 14 juil. 2015 à 09:43