Salut les mecs,
Je viens de finir de polir une fonction sensée ajuster un code python qui lui
serait passé en paramètre.
Par ajuster, je veux dire concrètement:
* séparer les opérateurs des autres caractères par un espace à gauche et à
droite;
* mettre un caractère d'espace à gauche avant les englobants ouvrants que sont
les caractères "([{" et veiller à ce qu'il n'y en ait pas à droite;
* éliminer les espaces à gauche des englobants fermants que sont les caractères
")]}"
* éliminer les espaces à gauches du caractère ":";
* éliminer les espaces superflux (c'est-à-dire plus de 2 espaces hormis les
chaînes string ou commentaires) dans tout le code;
* éliminer les espaces et tabulation à la fin des lignes nonvides.
D'autres traitements peuvent encore être réalisés, mais ceux sus-cités rendent
déjà le code plus homogène, plus synchrone et plus propre.
Petite précision: cette fonction prend le soin d'écarter du code toutes les
chaînes string et commentaires avant d'appliquer ces ajustement, pour finir par
restaurer ces chaînes string et commentaires exactement aux endroits qu'ils
occupaient.
Je pense que cette fonctionnalité peut se proposer sous la forme d'un élément
de menu pour permettre à l'utilisateur d'ajuster/formatter le code au moment
voulu;
ou être intégrée à la vérification automatique d'une ligne qui vient d'être
modifiée afin de rapidement correctement formatter la dite ligne.
Mais pour le moment, à la fin de cette fonction, au lieu de remplacer le texte,
je me contente d'un print qui sert à apprécier la convertions dans la pseudo
console de 6pad++.
Je réfléchis actuellement sur l'étape supérieure vers son évolution qui est la
re-écriture des mots clés.
Essayez d'imaginer la possibilité que si vous avez déjà écrit un nom de
variable plus haut dans le code, que vous n'ayez plus à vous soucier du respect
de la cass lors de son écriture plus bas à cause du fait que le script ajuste
automatiquement cette cass.
Cependant, ce comportement sous-entendrait par exemple que les variables a
(minuscule) et A (majuscule) ne seraient plus différenciées et que leur cass
serait ajusté selon la première de leur écriture, d'où ma préoccupation
d'aujourd'hui.
Je trouve que ceci n'est pas anodin et va au dela d'une simple mise en forme du
code.
Peut-on véritablement coder en python comme on coderait en vb6 sans ce soucier
de la cass ?
Ce serait toute une autre philosophie de programmation et les conséquences pour
les anciens codes risquent de ne pas être si négligeables que ça.
Souhaitez-vous que j'aille dans cette direction ?
Y trouvez-vous des inconvénients ? Des raisons de me dissuader de
volontairement ainsi brider le python ?
Je vous colle quand même le code de la fonction que j'ai fais jusqu'ici.
Début du code python
def adjustCode(s):
# ajuste le code
lstPt = []
lstString = []
# recencement des chaînes string
# string avec triples quotes en appostrophes
lstPt.append ("'{3,5}[\w\W]+?'{3,5}")
# string avec triples quotes en guillemets
lstPt.append("\"{3,5}[\\w\\W]+?\"{3,5}")
# string avec appostrophes
lstPt.append (r"'.*?((?<!\\\\\\\\\\)|(?<!\\\\\\)|(?<!\\))'")
# string avec guillemets
lstPt.append (r'".*?((?<!\\\\\\\\\\)|(?<!\\\\\\)|(?<!\\))"')
# commentaire uniligne
lstPt.append ("\\#[^\\r\\n]*")
# concaténation
pt = "("+"|".join(lstPt)+")"
# recherche
lstString = re.finditer(pt, s)
# remplacement des strings et commentaires par des génériques
i = 0
iStart = 0
iEnd = 0
s2=s
s = ""
tag = "[___tag___yyd"
for e in lstString:
i=i+1
d, f = e.span(0)
iEnd = d-1
s= s + s2[iStart: iEnd+1] + tag + str(i) + "]"
iStart = f
# end for
# ajout de la dernière portion
try: s = s + s2[f:]
except: pass
# séparation des opérateurs des autres caractères par des espaces
pt = r"[ ]*(\+=|-=|\*=|/=|<=|>=|==|!=|=|\+|-|\*|/|!=|<|>|%)[ ]*"
s = re.sub(pt, " \\1 ", s)
# les englobeurs ouvrants doivent être
# séparés des autres caractères par un espace à gauche
pt = r"([\(\[\{]+)[ ]*"
s = re.sub(pt, " \\1", s)
# ceux desquels On doit retirer les espaces avant
pt = r"([_]*[a-z][a-z_\d]*)[ ]+([\(\[\{]+)"
s = re.sub(pt, "\\1\\2", s, re.I)
# les englobeurs fermants
pt = r"[ ]*([\)\]\}:]+)"
s = re.sub(pt, "\\1", s)
# ceux qui doivent avoir un espace avant, mais pas après
pt = r"[ ]*([\\]+)[ ]*"
s = re.sub(pt, " \\1", s)
# ceux qui doivent avoir un espace après, mais pas avant
pt = r"[ ]*([,]+)[ ]*"
s = re.sub(pt, "\\1 ", s)
# les espaces trop grands
pt = r"[ ]{2,}"
s = re.sub(pt, " ", s)
# élimination des espaces et tabulations en fin de ligne
pt = r"([^ \t]+)[ \t]+$"
s = re.sub(pt, "\\1", s, re.M)
# restauration des string à partir des génériques
i = 0
for e in lstString:
i = i+1
s = s.replace(tag+str(i)+"]", e.group(0), 1)
# end for
print(s)
# end def
Fin du code python
Yannick Daniel Youalé
La programmation est une religion. Aimez-la, ou quittez-la.
www.visuweb.net