[Python] : how to overload a Pypot method

I have a question about overloading methods in Python. I do not see how to do. Example :
I want to modify the error file in pypot.dynamixel. Til now, I modified directly the pypot code but it is very dirty. :blush:
I did the same for the rest.py to add a new rest API method.

Thanks for your help.

Plusieurs réponses possibles à cette question:

  • Si tu cherches Ă  enlever un bug/apporter une nouvelle feature vraiment interressante Ă  Pypot: autant en faire profiter tout le monde. Tu forkes le repository pypot dans ton git hub, tu modifies, tu pushes dans ton github, puis tu fais un pull request vers pypot.

  • Si tu fais des modifs qui peuvent intĂ©resser certaines personnes mais pas tout le monde: tu forkes le repository pypot et tu modifies ton pypot (eventuellement en faisant des branches).

  • Si tu veux garder ton pypot dans l’état d’origine (pour compatibilitĂ©, par exemple) tu peux essayer de faire de l’hĂ©ritage: tu crĂ©es un classe Python qui hĂ©rite de la classe de Pypot que tu veux modofier et tu peux surcharger (overload) certaines fonctions. Il faut ensuite bien gĂ©rer les imports pour appeler ta classe, qui utilisera ses fonctions par dĂ©faut ou les fonctions de la classe parente si tu ne les a pas surchargĂ©es.

Answer seemed easier to write in french, I can translate if needed.

Merci pour ces rĂ©ponses. Pour la troisiĂšme option, ce dont j’ai peur c’est que, par exemple, le module rest.py est importĂ© dans un autre module de pypot auquel je n’ai pas accĂšs (si je m’interdit de toucher au code de pypot). Ce module en question, il faudrait donc que je le surcharge aussi ? et ainsi de suite. Au final, je risque de tout surcharger et de faire pĂ©ter le disjonteur.

Je suis d’accord avec toi, je n’ai pas de solution miracle


Y a-t-il une raison particuliĂšre pour refuser de modifier Pypot ? En ajoutant un remote repository, tu peux rĂ©cupĂ©rer les mises Ă  jour de la version officielle mĂȘme dans ton pypot modifiĂ© (au risque de quelques conflits, bien sur).

Dans l’exemple que tu donnes oĂč tu souhaites que ta modification Ă  rest.py soit propagĂ©e Ă  tous les modules qui l’utilises tu dois trĂšs clairement choisir une des deux premiĂšres options.

Tu peux Ă©galement faire des patchs de code Ă  la volĂ©e (au runtime), tu peux regarder la maniĂšre dont marche pypot_time et vrep_time par exemple. Par contre, je ne le recommanderais vraiment que dans des cas trĂšs particuliers car cela rend la lecture du code extrĂȘmement complexe pour qui ne connait pas bien les rouages de python.

Comme indiquĂ© plus haut, je pense que pour toi la maniĂšre la plus simple et efficace de travailler et d’avoir ton fork perso de pypot que tu maintiens Ă  jour avec la branche “officielle”. Tout ce que tu dĂ©veloppes et que tu penses peut avoir de l’intĂ©rĂȘt pour les autres fait une pull request, mĂȘme si c’est dans un Ă©tat instable, pas propre, etc
 la pull request doit ĂȘtre vu plutĂŽt comme une maniĂšre de nous dire: “regardez je travaille lĂ  dessus, ça vous intĂ©resse, comment on pourrait faire pour l’intĂ©grer”.

Nous ne sommes pas toujours réactif pour intégrer les autres codes car nous essayons de conserver une uniformité relative du code et que les journées ne font que 24H mais il ne faut surtout pas hésiter à proposer des modifications !

BTW, la fonction que tu as rajoutĂ© Ă  l’API REST aurait tout Ă  fait sa place dans le dĂ©pĂŽt officiel !

1 Like

Merci pour vos reponses. Je ne suis pas habitué encore a toutes les fonctions de git et surtout comment les utiliser. Mais je comprends le truc.
Matlab permet justement de surcharger facilement une fonction du noyau, mais j’avoue, c’est un mauvais reflexe :wink:

J’ai fait mon fork de pypot, j’ai fait mes modifs comme il faut. J’ai juste une question :
Quand vous faites des mises Ă  jours sur la version officielle de Pypot, comment je peux rapatrier les commits de retard ? Je n’ai pas trouvĂ© le bouton dans github (j’ai trouvĂ© le pull request mais pas l’inverse).

Merci.

Excellente question :wink:

Je me suis aussi posĂ© la question et j’ai fouillĂ© un peu pour trouver la rĂ©ponse donc j’ai eu le rĂ©flexe de faire un bout de doc pour la prochaine fois que j’en aurai besoin


To keep up-to-date with the original code, we are going to add a remote directory. Choose a meaningful name (I often use ‘official’). Find the HTTPS clone URL from the original project and type (inside the git folder):

> git remote add <name> <URL>
> git remote -v

The second line shows you your remote directories. Now you can fetch (pull) or push from and on two distinct remote repositories (origin being the one you initially cloned from). To update your robot and your github, first get the latest code from the new remote, then push it on your github repo:

> git pull <name> master
> git push origin master

If you try to push to the original code remote, you will get a ‘forbidden’ error.

Et aussi un bon conseil pour la suite:

If you have only a few minor modifications to do, you can keep it that way: change the code, commit and push in this directory, then go to GitHub to do a ‘pull request’.

But if you have multiple modifications to do on different subparts, you may want to separate them. This will also easy the work of the owner of the original project: he will be able to integrate small, consistent modification one at a time instead of having to test all your modifications and accept all of them or none of them.

So let’s go branching. A branch is a different copy of the same git directory that allows you to modify things and easily go back to previous, stable state.

Create a branch (branch named test-branch for the example, call it something meaningful) and add it to your GitHub repo:

> git checkout -b test-branch

Now if you commit, it commits in the branch. Push in the branch:

> git push origin test-branch

You can now make a pull request to the original code with your branch and start another branch to keep working while your pull request waits for acceptance.

Tout ça devrais ĂȘtre intĂ©grĂ© un jour (prochain) dans une doc pour dĂ©veloppeurs.

1 Like

Ou plus simple, tu peux directement rĂ©cupĂ©rer la branche master distante de la sorte (l’url dĂ©pend Ă©videment du dĂ©pĂŽt git)

git pull https://github.com/poppy-project/pypot.git

Tu peux aussi récupérer directement une branche en particulier, par exemple pour récupérer la branche distante gh-pages dans ton dépÎt actuel :

git pull https://github.com/poppy-project/pypot.git gh-pages

Si tu aimes bien l’interface graphique de Github, tu peux aussi choisir de faire une pull request sur ton dĂ©pĂŽt. Pour cela il faut faire une pull request en prenant comme “base fork” ton dĂ©pĂŽt, choisir ensuite “compare accross fork”, puis choisir comme “head fork” le dĂ©pĂŽt officiel (cf capture Ă©cran).

Si la pull request peut ĂȘtre mergĂ©e automatiquement ça fait la mĂȘme chose que prĂ©cĂ©demment ; si ce n’est pas le cas il faut le faire Ă  la main pour rĂ©soudre les conflits ce qui perd son intĂ©rĂȘt.

2 Likes

Super, merci Ă  vous deux pour ces astuces. Du coup, j’ai fait ma version de Pypot pour la scĂšne avec dĂ©sactivation des checksum error (un bonheur), update de l’API REST pour des trames compressĂ©es et la dĂ©sactivation de l’overload error (plus dangeureux, je sais, mais l’arret du robot sur scĂšne est interdit)