|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
![]() ![]() bruno pagèsDéveloppeur informatique Inscription : juin 2005 Messages : 2 970 ![]() |
Bonsoir,
vous trouverez ici ma proposition de prise en compte de Python dans Bouml. [EDIT] obsolète, la version 2 de la proposition est ici[/EDIT] de la commenter (le fond, la forme importe peu).Attention de ne pas prendre pour argent comptant ce que je dis sur Python, gardez à l'esprit que mes connaissances sur Python sont aussi limitées que nouvelles Bruno |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Anthyme CaillardInscription : mars 2004 Messages : 1 538 ![]() |
pour ce qui est des accesseurs (inexistant en python) je ne pense pas que '_' represente bien protected.
Je ne pense pas qu'il soit logique d'acceder aux attributs de la super classe qui commence par '_' je pense pas que cela se fasse dans l'implementation de python. Cela correspond plutôt à 'private' vis a vis des docstring, je ne les ai jamais vu decallé apres les """ je les ai toujours vu comme ceci : Voila bonne continuation |
|
00
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Inscription : décembre 2007 Messages : 21 ![]() |
Beh ... faut pas chomer par ici ...
![]() donc: au 2.3 l'operation Class.foo() pour tout Class.__foo (private) dans le reverse ne me parait pas justifiée. En python 2.5 pour rendre accessible un __foo on passe par des properties donnant a l'exec un Class.foo read et/ou write selon le codage de la property. Pour dire qui si foo() il y a dans le code il se peut, mais ce n'est pas obligatoire, qu'il soit lié au __foo. La detection du mot clé property est le seul moyen de prouver un lien explicite. Une autre routine pourrait retourner __foo sans etre une property. La génération automatique de foo() peut créer des doublons. Regarder la doc de __metaclass__ qui permet de traiter une classe comme un objet au niveau class (génération de classes ou de pré-traitement a la création de classe. Si il ya un lien avec UML en tenir compte. 2.4 self n'est pas obligatoire mais c'est bien de ne pas permettre de le changer ça permet de forcer dans les bonnes pratiques des pythonistas 2.5 Qd on a class A(B): dans le init de A il faudrait rajouter un appel __init__ de la class B qui n'est pas automatique. Voir le mot-clef super aussi. dans un module de class (es) il est possible d'avoir des def blabla non encapsulées dans la class, tout en étant appelable depuis la classe. C'est le scope module (fichier .py) de python. Si il y a un lien avec UML, en tenir compte. 2.8 Les chemins relatifs c'est nouveau, je préfererai pas dans un 1er temps le code est moins clair. 2.10 Un fichier.py peut contenir class A:, class B: etc ... et aussi des def isolées utilisées dans le module (fichier.py). Si on génère un A.py pour class A un B.py pour class B, indépendant les uns des autres je vois pas de probleme. En reverse depuis un existant quid ?? Les chemins de module sont dans python path. Les espaces sont visibles depuis sys.xxx. Le dict de classe contient ce qui est dans son espace. Pour le reste c'est joli tout plein ![]() A+ |
|
|
00
|
|
|
#4 | ||||
![]() ![]() bruno pagèsDéveloppeur informatique Inscription : juin 2005 Messages : 2 970 ![]() |
Citation:
j'ai dis qu'une opération reversée appelée __foo dans le source donnerai une opération appelée foo dans le modèle ce que je propose c'est que le générateur prenne en compte les visibilités pour ajouter un prefixe automatiquement, l'autre avantage etant de cacher les __ 'pas très beau' quand on a un oeil non pythonesque. Bien évidemment le reverse doit alors retirer le prefixe pour retomber sur ses pieds mais de toute facon la chose est débraillable, je souhaite juste que vous m'indiquiez les 'bonnes' valeurs par défaut de ces settings selon vous Citation:
Citation:
Citation:
si les classes A et B sont associée à l'artifact C, alors les classes A et B seront produites dans C.py, le problème n'est pas là dans Bouml si on veut produire le code de la classe A dans le fichier F.py il faut :
c'est donc assez lourd, pour aider on peut demander à Bouml de faire lui-même les étapes 2 à 4 via le menu de la classe, et le plug-out appelé deploy classse le fait pour toutes les classes d'une vue de classes qui n'ont pas d'artifact associé. Le problème est que dans ce cas là les artifacts crées portent le nom de leur classe associée (évidemment il est ensuite possible de les renommer, mais s'il y a 100 artifacts ...) |
||||
|
|
00
|
|
|
#5 | ||
|
Nouveau Membre du Club
![]() Inscription : décembre 2007 Messages : 21 ![]() |
Citation:
Envoyé par bsadacheng Voir le message au 2.3 l'operation Class.foo() pour tout Class.__foo (private) dans le reverse ne me parait pas justifiée. je suis tout à fait d'accord ... sauf sur le fait que j'ai dit cela j'ai dis qu'une opération reversée appelée __foo dans le source donnerai une opération appelée foo dans le modèle ce que je propose c'est que le générateur prenne en compte les visibilités pour ajouter un prefixe automatiquement, l'autre avantage etant de cacher les __ 'pas très beau' quand on a un oeil non pythonesque. Bien évidemment le reverse doit alors retirer le prefixe pour retomber sur ses pieds mais de toute facon la chose est débraillable, je souhaite juste que vous m'indiquiez les 'bonnes' valeurs par défaut de ces settings selon vous ____________ le protected avec _ est une bonne idée, ya pas mal de code comme ça ou le _ veut bien dire "la c'est moi qui jardine" pas touche. Les choix me paraissent les bons. Masquer le __ et le _ dans le modèle oui bien sur puisque les tag potected,private etc sont gérés par bouml no problem. Citation: 2.5 Qd on a class A(B): dans le init de A il faudrait rajouter un appel __init__ de la class B qui n'est pas automatique. Voir le mot-clef super aussi. ca c'est c'est à l'utilisateur de le faire, comment pourrais-je savoir ce qu'il faut donner en argument s'il y en a ? _________ certes les arguments .... et vu le nombre de façons de les passer .... ![]() Mouais ... Ne pas le faire c'est generer du code non fonctionnel. Pas beau. Par contre bouml connait les parametres de création de la super classe ( il a le init ) donc l'insertion de cette signature doit etre possible. Si c'est trop compliqué, mettre la signature avec () liste de parametres vide. Le code va se vautrer lamentablement mais au moins le progrmmeur saura où et pourquoi (aveugle ??). Par contre si le reverse ellimine la signature en la vidant encore pas beau. Le reverse pourrait commenter le code qd il ne peut pas faire ce qu'il lit comme code? Je délire peut-etre .... Citation: dans un module de class (es) il est possible d'avoir des def blabla non encapsulées dans la class, tout en étant appelable depuis la classe. C'est le scope module (fichier .py) de python. Si il y a un lien avec UML, en tenir compte. ce genre de chose n'est pas modélisable en UML, mais : * cela n'est pas perdu par le reverse (partie 1 ou 3 cf 2.10) * c'est possible à générer en le mettant directement dans la définition de l'artifact, ou en l'attachant à la définition d'une classe en le mettant avant ou après. La seule chose c'est que c'est du texte pur et dur Magnifique !!! On est sauvé !!! Citation: 2.10 Un fichier.py peut contenir class A:, class B: etc ... et aussi des def isolées utilisées dans le module (fichier.py). Si on génère un A.py pour class A un B.py pour class B, indépendant les uns des autres je vois pas de probleme. En reverse depuis un existant quid ?? on c'est mal compris, je n'ai peut etre pas été assez clair dans la doc si les classes A et B sont associée à l'artifact C, alors les classes A et B seront produites dans C.py, le problème n'est pas là dans Bouml si on veut produire le code de la classe A dans le fichier F.py il faut : 1. creer la classe avec ses membres 2. creer si besoin une vue de deployment 3. creer un artifact dans la vue de deployment et l'appeler F 4. editer l'artifact pour mettre sont stéréotype à "source" et pour demander l'association avec A c'est donc assez lourd, pour aider on peut demander à Bouml de faire lui-même les étapes 2 à 4 via le menu de la classe, et le plug-out appelé deploy classse le fait pour toutes les classes d'une vue de classes qui n'ont pas d'artifact associé. Le problème est que dans ce cas là les artifacts crées portent le nom de leur classe associée (évidemment il est ensuite possible de les renommer, mais s'il y a 100 artifacts ...) J'ai pas compris Par contre dans 2.6.1.3 macros ${type} : produit le type de l'attribut, par exemple pour l'utiliser dans un commentaire, éventuellement en plaçant celui-ci directement dans la définition * Là ya un truc intéressant a faire. Si c'est posible evidemment. Le type en python est connu a l'exec soit; Mais il est possible de wrapper la modif d'un attribut pour verifier le type. On peut faire ça avec un decorator donc on pourrait avoir dédoublement de ${type} en ${typed} , l'info du type irait dans la doc, et ${typev}${deco} ou deco serait le decorator de validation des types donc un nom de fonction et le géné devrait ecrire @deco devant la routine de modif de l'attribut. On est peut-etre trop loin de UML et trop dans python là ??? Le code du decorator juste pour rire, et pour les codeurs quilisent Code :
A+ |
||
|
|
00
|
|
|
#6 | |||
![]() ![]() bruno pagèsDéveloppeur informatique Inscription : juin 2005 Messages : 2 970 ![]() |
par pitié bsadacheng, ne fait pas les citations à la main, tu dois te rendre compte qu'il y a comme une différence entre l'affichage de ton message et les autres
![]() Citation:
Citation:
Citation:
Bouml ne vide aucune signature au reverse, ni les corps des opérations etc ... |
|||
|
|
00
|
|
|
#7 | |
![]() ![]() bruno pagèsDéveloppeur informatique Inscription : juin 2005 Messages : 2 970 ![]() |
Citation:
inutile de dédoubler ${type} en deux nouvelles macros, tu peux écrire ${type} autant de fois que tu veux, cela ne s'use pas si tu veux que Bouml produise '@deco' alors mets '@deco' directement là où tu veux, il est inutile de me demander de faire une macro pour cela petit rappel : les plug-outs sont là pour automatiser ce que vous ne souhaitez pas faire à la main, donc n'hésitez pas à faire des plug-outs modifiant vos modèles comme vous le souhaitez |
|
|
|
00
|
|
|
#8 | |||||||
|
Expert Confirmé Sénior
![]() Thierry ChappuisEnseignant Chercheur Inscription : mai 2005 Messages : 3 481 ![]() |
Citation:
En ce qui concerne la génération des docstrings, le format que je rencontre le plus (et que j'utilise) est: Code python :
J'ai rarement rencontré: Code python :
Citation:
Citation:
Comment cela se passe-t'il pour les méthodes de classe (décorateur @classmethod) et pour les méthodes statiques (décorateur @staticmethod) à la génération et au reverse? Sinon, je suis enthousiaste. Meilleures salutations Thierry
__________________
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow FAQ-Python FAQ-C FAQ-C++ +
|
|||||||
|
00
|
|
|
#9 | |||||||||||
![]() ![]() bruno pagèsDéveloppeur informatique Inscription : juin 2005 Messages : 2 970 ![]() |
Citation:
Une classe est ancienne (< Python 2.2) ou-exclusivement nouvelle (Python >= 2.2) Citation:
Citation:
Citation:
Citation:
Citation:
Si des décorateurs sont associés à une opération, ceux-ci seront produits par le générateur. Mais dans ma proposition les décorateurs sont tous soit issus du reverse, soit ajoutés à la main en éditant l'opération. Je ne comptais pas automatiquement ajouter le décorateurs @classmethod lorsqu'une opération est déclarée 'de classe', et par cohérence je ne comptais pas mettre un bouton pour indiquer d'une opération est statique et ajoutant donc @staticmethod. Dans ma proposition il faut donc éditer les décorateurs de l'opération pour ajouter @classmethod ou @staticmethod. Cependant Bouml pourais très bien ajouter/retirer automatiquement ces décorateurs parmis la liste des décorateurs (sauf ancienne classe). Si tel est le cas il faudrait sans doute ajouter ces décorateurs en fin de liste pour qu'ils soient vus par d'éventuel autres décorateurs car si j'ai bien compris Code :
|
|||||||||||
|
|
00
|
|
|
#10 | ||
![]() ![]() bruno pagèsDéveloppeur informatique Inscription : juin 2005 Messages : 2 970 ![]() |
finalement, concernant @classmethod et @staticmethod pour les opérations :
P.S. Python aurait vraiment pu choisir autre chose que classmethod qui est très trompeur
|
||
|
|
00
|
|
|
#11 |
![]() ![]() Matthieu BrucherDéveloppeur HPC Inscription : juillet 2005 Messages : 9 607 ![]() |
Dans l'ensemble, j'aime beaucoup ta proposition.
En ce qui concerne les commentaires, j'ai surtout vu ça : Mais c'est accessoire. C'est quoi le problème avec classmethod ? Je pense que les nouvelles classes devraient être sélectionnées par défaut, Python 2.2 est suffisamment vieux pour cela, non ? |
|
|
00
|
|
|
#12 | ||||||
![]() ![]() bruno pagèsDéveloppeur informatique Inscription : juin 2005 Messages : 2 970 ![]() |
Citation:
Code :
Code :
Citation:
Vu ma 'très forte expérience en Python' je ne me sens pas le droit de ne pas suivre les choix du manuel de référence |
||||||
|
|
00
|
|
|
#13 |
![]() ![]() Matthieu BrucherDéveloppeur HPC Inscription : juillet 2005 Messages : 9 607 ![]() |
Il est recommandé maintenant de faire des nouvelles classes par défaut, c'est le truc à retenir de Python.
Elles seront d'office "nouvelles" dans Python 3k (même sans object), mais toutes les classes Python sont maintenant nouvelles. |
|
|
00
|
|
|
#14 |
![]() ![]() bruno pagèsDéveloppeur informatique Inscription : juin 2005 Messages : 2 970 ![]() |
Quand une opération est d'instance cette dernière est associée au paramètre self que Bouml rajoute de lui même.
Qu'en est-il pour une @classmethod ? cls est-t-il le nom de paramètre habituel ? Bouml doit-il ajouté d'office ce paramètre comme il le fait pour self ?
|
|
|
00
|
|
|
#15 | |
|
Expert Confirmé Sénior
![]() Thierry ChappuisEnseignant Chercheur Inscription : mai 2005 Messages : 3 481 ![]() |
Citation:
Thierry
__________________
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow FAQ-Python FAQ-C FAQ-C++ +
|
|
|
00
|
|
|
#16 | ||
![]() ![]() bruno pagèsDéveloppeur informatique Inscription : juin 2005 Messages : 2 970 ![]() |
Python commence à me les briser menu (c'est pas des gros mots, c'est d'Audiard) avec ces changements continuels à propos des classes (v < 2.2, 2.2 <= v < 4.0, v >= 4.0 ...)je ne comprends pas vos remarques :
|
||
|
|
00
|
|
|
#17 |
![]() ![]() Matthieu BrucherDéveloppeur HPC Inscription : juillet 2005 Messages : 9 607 ![]() |
1) oui, mais c'est à éviter.
2) c'est plus sioux que ça, la différence. Faut que je me replonge dans mes écrits pour te donner la réponse. |
|
|
00
|
|
|
#18 | |||||
|
Expert Confirmé Sénior
![]() Thierry ChappuisEnseignant Chercheur Inscription : mai 2005 Messages : 3 481 ![]() |
Citation:
2) Certes tu peux invoquer le décorateur @classmethod depuis une classe ancien style. Mais si tu désires implanter un tel décorateur (appelons-le MethodeDeClasse), tu dois utiliser un descripteur et la classe MethodeDeClasse doit être nouveau style. Code python :
Les classes ancien style sont capables de gérer un descripteur et donc d'utiliser @classmethod ou @MethodeDeClasse. C'est d'ailleurs ce qu'elles font également lors d'un appel de fonction, une fonction n'étant rien d'autre qu'un descripteur implanté à l'aide d'une classe nouveau style (même dans les classes ancien style). Les classes nouveau style sont donc centrales dans le modèle sous-jacent actuel de Python. L'utilisation systématique de classes nouveau style permet d'harmoniser ce modèle de le rendre beaucoup plus cohérent. Les classes ancien style sont appelées à disparaître (c'est pour Python 3.0). Python 2.5 ne les conserve que pour des raisons de compatibilité ascendante et je vois que des désavantages à les utiliser. Python tourne aujourd'hui autour des classes nouveau style et il est fortement conseillé de dériver toutes ses classes de object. EDIT: Il n'y a pas de changement continuel de la sémantique des classes dans Python comme tu semble t'en plaindre. Il y a eu un changement de direction charnière avec Python 2.2. Python évolue désormais vers sa version 3.0 et les classes nouveau style sont de plus en plus mises en avant. Je ne vois pas de complication majeure à utiliser les classes nouveau style par défaut dans Bouml et je pense que cela correspondrait beaucoup plus à l'évolution actuel du langage. Thierry
__________________
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow FAQ-Python FAQ-C FAQ-C++ +
|
|||||
|
00
|
|
|
#19 | |
![]() ![]() bruno pagèsDéveloppeur informatique Inscription : juin 2005 Messages : 2 970 ![]() |
![]() Je viens de regarder le manuel de ref de la 3.0, il est toujours écrit Citation:
![]() Pour le reste je suis assez perplexe, contrairement à vous ce qui m'importe le plus n'est finalement pas la sémantique mais la syntaxe, et s'il y a une notation appelée à disparaitre c'est bien celle de la 2.2 avec l'héritage explicite d'object (même si elle est tolérée en 3.0). Le problème majeur concerne bien évidemment le reverse et ce qu'il doit faire lorsqu'il lit class C : pass, car cela peut être une classe < 2.2 ou >= 3.0 ![]() Le flag old/new que j'avais prévue ne marchera donc plus avec Python 3.0 Trois solutions possibles :
Sinon, j'ai voulus 'trop bien faire', avec trop d'automatisations, ce qui est incompatible avec un langage instable et surtout sans compatibilité ascendante ![]() Donc :
Merci aux participants
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com