Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

manipulation chaines - remplacant string.replace() - append d'un fichier vhost apache

31 réponses
Avatar
R12y
Bonjour,

Pour des raison didactiques, je me suis lancé dans la traduction en
python de mes scripts shell. Du moins pour ceux qui pouvaient se
transformer ainsi, sans heurts.

Parmis eux, un script qui consiste à ajouter une section de VHost à
apache.
Pour faire court, une section Vhost apache est un morceau de texte
ressemblant à ceci:

<VirtualHost *>
ServerName www.toto.fr
ServerAlias toto.fr
DocumentRoot /home/toto
</VirtualHost>

En vrai sur mon apache cette section fait environ 15 lignes mais tous les
Vhosts ont la même tronche.

Le cript chell actuel, s'invoque comme ceci:
$ addvhost.sh toto.fr

Il s'occupe avec un coup de awk à isoler le "toto" du "fr" pour former la
chaîne /home/toto et puis le reste va tout seul. Ce n'est que mise bout
à bout de choses simples.

J'ai donc un modèle (template?) de Vhost, qui rapporté à notre exmple
serait:

<VirtualHost *>
ServerName FQDN
ServerAlias DN
DocumentRoot HOMEDN
</VirtualHost>

Et le scrip remplaçait les mot en majuscules par ce qu'il faut.
Maintenant j'en viens aux questions.

Vaut-il mieux que je conserve le modèle en dur dans le même fichier que
le script? dans un fichier séparé? Dans la mesure ou ce script ne sera
utilisé que quand on ajoute un Vhost, c'est à dire une fois par semaine
tout au plus.

J'ai été surpris que dans python 2.4, replace(), du module strig est
dans la catégorie des fonctions dépréciées. Mais il n'est indiquée
nulle part dans le chapitre la fonction qui est censée la remplacer.
Laquelle est-elle s'il vous plait?

Merci.

--
SPIP, phpNuke, Plone, opengroupware... c'est bien
CPS c'est mieux: http://www.cps-project.org/
Hébergement de sites CPS: http://www.objectis.org/

10 réponses

1 2 3 4
Avatar
Christophe
R12y wrote:

On Mon, 12 Sep 2005 13:41:33 +0200, Jerome wrote:

Je ne pense pas qu'il y ait une façon simple d'ajouter de nouvelles
methodes dans str.



class MyString(str):




Je pense que le "bordel" auquel il faisait allusion est qu'en en faisant
ça, on a des strings _et_ des MyString dans le binz...



oui mais un objet MyString est aussi une chaine classique, tu peux
l'utiliser telle quelle dans toutes les fonctions qui prennent des
chaînes en paramètres de façon transparente.

def func(s1, s2):
print s1.lower() + s2.upper()

func('begin', MyString('end'))
func('begin', 'end')
func(MyString('begin'), MyString('end'))


A partir du moment où tu sais ce que tu fais, tout est possible ;-)



Oui et à la première occasion, tu tombes sur une fonction qui te renvoye
un str au lieu d'un MyString par exemple et pof, plantage.




Avatar
Jerome
Christophe wrote:

R12y wrote:

On Mon, 12 Sep 2005 13:41:33 +0200, Jerome wrote:

Je ne pense pas qu'il y ait une façon simple d'ajouter de nouvelles
methodes dans str.




class MyString(str):





Je pense que le "bordel" auquel il faisait allusion est qu'en en faisant
ça, on a des strings _et_ des MyString dans le binz...



oui mais un objet MyString est aussi une chaine classique, tu peux
l'utiliser telle quelle dans toutes les fonctions qui prennent des
chaînes en paramètres de façon transparente.

def func(s1, s2):
print s1.lower() + s2.upper()

func('begin', MyString('end'))
func('begin', 'end')
func(MyString('begin'), MyString('end'))


A partir du moment où tu sais ce que tu fais, tout est possible ;-)



Oui et à la première occasion, tu tombes sur une fonction qui te renvoye
un str au lieu d'un MyString par exemple et pof, plantage.


ben si ta fonction te retourne un str mais que tu veux un MyString tu
n'as qu'à faire un cast et tu as un MyString.





Avatar
Christophe
Oui et à la première occasion, tu tombes sur une fonction qui te
renvoye un str au lieu d'un MyString par exemple et pof, plantage.



ben si ta fonction te retourne un str mais que tu veux un MyString tu
n'as qu'à faire un cast et tu as un MyString.


Essaye un jour de faire un projet comme ça et tu comprendras à quel
point c'est lourd pour le developeur et accessoirement pour les perfs aussi.

En plus, le code deviens illisible avec tous ces casts inutiles de partout.


Avatar
Jerome
Christophe wrote:

Oui et à la première occasion, tu tombes sur une fonction qui te
renvoye un str au lieu d'un MyString par exemple et pof, plantage.




ben si ta fonction te retourne un str mais que tu veux un MyString tu
n'as qu'à faire un cast et tu as un MyString.



Essaye un jour de faire un projet comme ça et tu comprendras à quel
point c'est lourd pour le developeur et accessoirement pour les perfs
aussi.

En plus, le code deviens illisible avec tous ces casts inutiles de partout.


Je code tous mes projets de cette façon et pour moi c'est plus lisible
d'avoir des classes bien définies et très spécialisées plutôt que des
structures fourre-touts avec lesquelles il faut se battre pour savoir à
quoi elles servent lors d'une évolution ultérieure.

Mais c'est une question de choix perso et de préférence je te l'accorde.

Après pour les perfs je suis d'accord, mais on n'a rien sans rien. Plus
on écrit du code abstrait et de haut-niveau et plus les performances
vont se dégrader, au profit de l'intelligibilité du code. Soit dit en
passant, si je veux faire du code performant je fais du c ou de
l'assembleur, pas du python.



Avatar
Christophe
Christophe wrote:


Oui et à la première occasion, tu tombes sur une fonction qui te
renvoye un str au lieu d'un MyString par exemple et pof, plantage.





ben si ta fonction te retourne un str mais que tu veux un MyString tu
n'as qu'à faire un cast et tu as un MyString.




Essaye un jour de faire un projet comme ça et tu comprendras à quel
point c'est lourd pour le developeur et accessoirement pour les perfs
aussi.

En plus, le code deviens illisible avec tous ces casts inutiles de
partout.



Je code tous mes projets de cette façon et pour moi c'est plus lisible
d'avoir des classes bien définies et très spécialisées plutôt que des
structures fourre-touts avec lesquelles il faut se battre pour savoir à
quoi elles servent lors d'une évolution ultérieure.


Je ne vois pas le rapport avec le cas présent. On parle de remplacer un
des types de base par une sous classe de celui-ci. Dans ce cas, il n'y a
pas de façon propre de le faire en Python pour l'instant. Si en plus
c'est pour raison aussi futile que d'ajouter quelques methodes
supplémentaires je pense que c'est une perte de temps que de faire comme
ça. Il suffit de définir un nouveau module contenant les fonctions
voulues et voila.

Mais c'est une question de choix perso et de préférence je te l'accorde.

Après pour les perfs je suis d'accord, mais on n'a rien sans rien. Plus
on écrit du code abstrait et de haut-niveau et plus les performances
vont se dégrader, au profit de l'intelligibilité du code. Soit dit en
passant, si je veux faire du code performant je fais du c ou de
l'assembleur, pas du python.


Pas daccord sur ce point. Ce genre de cast horrible poserais des
problèmes de perfs en C++ aussi. C'est juste un gros gaspillage de
ressource qui ne peut pas se justifier par le fait que l'on utilise un
langage "lent".




Avatar
Jerome


Je code tous mes projets de cette façon et pour moi c'est plus lisible
d'avoir des classes bien définies et très spécialisées plutôt que des
structures fourre-touts avec lesquelles il faut se battre pour savoir
à quoi elles servent lors d'une évolution ultérieure.



Je ne vois pas le rapport avec le cas présent. On parle de remplacer un
des types de base par une sous classe de celui-ci. Dans ce cas, il n'y a
pas de façon propre de le faire en Python pour l'instant. Si en plus
c'est pour raison aussi futile que d'ajouter quelques methodes
supplémentaires je pense que c'est une perte de temps que de faire comme
ça. Il suffit de définir un nouveau module contenant les fonctions
voulues et voila.


Est-ce que tu pourrais m'expliquer comment tu voudrais faire ça de façon
"propre" ?
Pour moi il y a deux solutions :
- l'approche objet avec la dérivation de la classe str
- l'approche procédurale avec la création d'un module à coté

Les deux se valent et sont implémentables facilement en python.

Je ne connais pas de langage où tu puisses substituer un nouveau type à
un type de base comme tu voudrais le faire (je crois). Est-ce que tu as
des exemples ?


Mais c'est une question de choix perso et de préférence je te l'accorde.

Après pour les perfs je suis d'accord, mais on n'a rien sans rien. Plus
on écrit du code abstrait et de haut-niveau et plus les performances
vont se dégrader, au profit de l'intelligibilité du code. Soit dit en
passant, si je veux faire du code performant je fais du c ou de
l'assembleur, pas du python.


Pas daccord sur ce point. Ce genre de cast horrible poserais des
problèmes de perfs en C++ aussi. C'est juste un gros gaspillage de
ressource qui ne peut pas se justifier par le fait que l'on utilise un
langage "lent".


Je voulais juste dire que pour ma part je suis prêt à sacrifier les
performances au profit de la lisibilité.


Avatar
Christophe


Je code tous mes projets de cette façon et pour moi c'est plus
lisible d'avoir des classes bien définies et très spécialisées plutôt
que des structures fourre-touts avec lesquelles il faut se battre
pour savoir à quoi elles servent lors d'une évolution ultérieure.




Je ne vois pas le rapport avec le cas présent. On parle de remplacer
un des types de base par une sous classe de celui-ci. Dans ce cas, il
n'y a pas de façon propre de le faire en Python pour l'instant. Si en
plus c'est pour raison aussi futile que d'ajouter quelques methodes
supplémentaires je pense que c'est une perte de temps que de faire
comme ça. Il suffit de définir un nouveau module contenant les
fonctions voulues et voila.



Est-ce que tu pourrais m'expliquer comment tu voudrais faire ça de façon
"propre" ?
Pour moi il y a deux solutions :
- l'approche objet avec la dérivation de la classe str
- l'approche procédurale avec la création d'un module à coté

Les deux se valent et sont implémentables facilement en python.


Malheureusement, les 2 ne se valent pas en Python car la première pose
justement de lourds problèmes de compatibilité avec le code existant.

Je ne connais pas de langage où tu puisses substituer un nouveau type à
un type de base comme tu voudrais le faire (je crois). Est-ce que tu as
des exemples ?


Ruby peut le faire.


Mais c'est une question de choix perso et de préférence je te
l'accorde.


Après pour les perfs je suis d'accord, mais on n'a rien sans rien.
Plus

on écrit du code abstrait et de haut-niveau et plus les performances
vont se dégrader, au profit de l'intelligibilité du code. Soit dit en
passant, si je veux faire du code performant je fais du c ou de
l'assembleur, pas du python.


Pas daccord sur ce point. Ce genre de cast horrible poserais des
problèmes de perfs en C++ aussi. C'est juste un gros gaspillage de
ressource qui ne peut pas se justifier par le fait que l'on utilise un
langage "lent".



Je voulais juste dire que pour ma part je suis prêt à sacrifier les
performances au profit de la lisibilité.


Et pour ma part, ajouter des cast sacrifie à la fois l'écriture, la
lisibilité et les performances. Ceci quelque soit le langage d'ailleurs.



Avatar
kaerbuhez
Quelques commentaires par rapport aux posts précédents de ce fil:

Je crois que Ruby permet de modifier un type de base. Comme toujours il
y a un trade off: plus le langage est dynamique (au point de permettre
ce genre de choses par exemple), plus le programmeur peut s'exprimer
librement et pour de petites applications/scripts, c'est tout benef.
Pour de plus grosses applications, celà devient difficile à gérer si il
faut tout lire pour comprendre la moindre ligne de code. En Python, on
"sait" ce que font les types de bases, ... "Explicit is better than
implicit"

Quelqu'un peut-il expliquer ce qu'est un cast en Python ?
Je rappelle qu'un cast est une "indication" au compilateur disant à peu
prés, "tu peux me faire confiance et considérer cet objet comme étant de
tel type" : ça n'a __AUCUN__ sens dans un langage dynamique. __AUCUN__
!!! Et si par la, le posteur voulait SIGNIFIER qu'on peut instancier un
objet du sous-type de str à partir de l'objet str (typiquement
aMy_str=My_str(aStr) ), ça n'a __RIEN__ à voir avec un cast. __RIEN__
!!! N'oublions pas que ce newsgroup est aussi lu par des débutants avant
d'écrire ce genre de choses ...

Faire un sous-type de str a évidemment tout son sens si on a vraiment
affaire a une sorte spécifique de str. Il faut alors réécrire certaines
méthodes pour qu'elles renvoient des instances de ce sous-type et plus
des str. Contrairement à Java (par exemple) ou ce genre d'exercice se
fait à grand coups de copier/coller et génere un code particulièrement
verbeux, Python (avec getattr par exemple) offre des outils qui
simplifient fortement ce genre de travail.
A l'inverse, si on a besoin de nouvelles fonctions sur les str, un
module est effectivement adapté.

Pour en revenir aux questions de départ:



Vaut-il mieux que je conserve le modèle en dur dans le même fichier que
le script? dans un fichier séparé? Dans la mesure ou ce script ne sera
utilisé que quand on ajoute un Vhost, c'est à dire une fois par semaine
tout au plus.

Fait au plus simple (mais écris lisiblement et commente ;-) !!!). Si ça

marche, c'est bon et quand tu voudras étendre, tu pourras toujours
changer d'avis. Python ne sera jamais dans tes pieds pour ça ;-)

J'ai été surpris que dans python 2.4, replace(), du module strig est
dans la catégorie des fonctions dépréciées. Mais il n'est indiquée
nulle part dans le chapitre la fonction qui est censée la remplacer.
Laquelle est-elle s'il vous plait?

Comme déja répondu, utilise les méthodes de la classe str sur ses instances.


Avatar
Christophe
Quelqu'un peut-il expliquer ce qu'est un cast en Python ?
Je rappelle qu'un cast est une "indication" au compilateur disant à peu
prés, "tu peux me faire confiance et considérer cet objet comme étant de
tel type" : ça n'a __AUCUN__ sens dans un langage dynamique. __AUCUN__
!!! Et si par la, le posteur voulait SIGNIFIER qu'on peut instancier un
objet du sous-type de str à partir de l'objet str (typiquement
aMy_str=My_str(aStr) ), ça n'a __RIEN__ à voir avec un cast. __RIEN__
!!! N'oublions pas que ce newsgroup est aussi lu par des débutants avant
d'écrire ce genre de choses ...


En C et C++, un cast principalement à *convertir* un obejt d'un type
vers un autre. Si tu as un int et que tu cast en float, cela ne reviens
pas à dire au compilateur : fais moi confiance, ce bloc binaire est bien
un float mais c'est bien une convertion.

La ou il y a un vrai problème c'est quand tu cast un type de pointer
vers un autre avec un reinterpret_cast ou un cast C. Ici ce n'est pas de
cela que l'on parle mais bien des cast de convertion de type.

Donc la réponse à la question : un cast est simplement un appel de
constructeur.

a = "toto"
b = MyString(a)

:)

Faire un sous-type de str a évidemment tout son sens si on a vraiment
affaire a une sorte spécifique de str. Il faut alors réécrire certaines
méthodes pour qu'elles renvoient des instances de ce sous-type et plus
des str. Contrairement à Java (par exemple) ou ce genre d'exercice se
fait à grand coups de copier/coller et génere un code particulièrement
verbeux, Python (avec getattr par exemple) offre des outils qui
simplifient fortement ce genre de travail.
A l'inverse, si on a besoin de nouvelles fonctions sur les str, un
module est effectivement adapté.

Pour en revenir aux questions de départ:



Vaut-il mieux que je conserve le modèle en dur dans le même fichier que
le script? dans un fichier séparé? Dans la mesure ou ce script ne sera
utilisé que quand on ajoute un Vhost, c'est à dire une fois par semaine
tout au plus.


Fait au plus simple (mais écris lisiblement et commente ;-) !!!). Si ça


Essaye plutôt d'écrire lisiblement sans commenter. Les commentaires
gènent à la lisibilité et peuvent mentir. Rien ne vaut du code
compréhensible sans :)


Avatar
R12y
On Mon, 12 Sep 2005 15:46:54 +0200, Christophe wrote:

c'est pour raison aussi futile que d'ajouter quelques methodes


La raison évoquée était juste un exemple.
Elle est certes futile, mais c'est généralement des raison futiles qu'on
évoque dans les exemples.
Il va de soi pour moi que si ce n'est "que pour ça" je ne le ferais pas
volontairement.


--
SPIP, phpNuke, Plone, opengroupware... c'est bien
CPS c'est mieux: http://www.cps-project.org/
Hébergement de sites CPS: http://www.objectis.org/

1 2 3 4