Création et initialisation de variables à partir d'une string

Le
Eric Masson
'Lut,

Soit une string de la forme 'a=b c=d e=f'
Quelle serait la solution la plus propre pour créer 3 variables, a, c et
e, initialisées respectivement aux valeurs b, d et f, svp ?

Merci d'avance.

--
on pourrait pas avoir les résultats à l'occasion ?
Cela fait déjà 18 jours que le vote est fini, 13 jours que la liste des
votants est publiée
-+- ZL in : <http://www.le-gnu.net> - Feignants, ces volontaires ! -+-
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Damien Wyart
Le #25708982
* Eric Masson
Soit une string de la forme 'a=b c=d e=f'

Quelle serait la solution la plus propre pour créer 3 variables, a,
c et e, initialisées respectivement aux valeurs b, d et f, svp ?



"Quick & dirty" :

s = 'a=b c=d e=f'

b = 10
d = 11
f = 12

for e in s.split():
exec(e)

(j'ai supposé que tu voulais affecter les valeurs de b, d et f et non
les chaînes 'b', 'd', et 'f').

Plus propre, mais un peu plus lourd :

for e in s.split():
expr = e.split('=')
globals()[expr[0]] = globals()(expr[1])

(si on veut les chaînes 'b', 'd' et 'f' et non la valeur des variables
correspondantes, le membre de droite est beaucoup plus simple : expr[1] ).

Si tu veux une affectation locale au sein d'une fonction, on ne peut pas
modifier dynamiquement locals(), donc à ma connaissance, seule la
solution exec est envisageable.

--
DW
Eric Masson
Le #25709452
Damien Wyart
'Lut,

"Quick & dirty" :

s = 'a=b c=d e=f'

b = 10
d = 11
f = 12

for e in s.split():
exec(e)

(j'ai supposé que tu voulais affecter les valeurs de b, d et f et non
les chaînes 'b', 'd', et 'f').

Plus propre, mais un peu plus lourd :

for e in s.split():
expr = e.split('=')
globals()[expr[0]] = globals()(expr[1])

(si on veut les chaînes 'b', 'd' et 'f' et non la valeur des variables
correspondantes, le membre de droite est beaucoup plus simple : expr[1] ).

Si tu veux une affectation locale au sein d'une fonction, on ne peut pas
modifier dynamiquement locals(), donc à ma connaissance, seule la
solution exec est envisageable.



Je m'en suis sorti avec une variante de la première solution :
for e in sys.argv[5].replace("-","_").split():
expr = e.split('=')
cexpr = expr[0] + "='" + expr[1] + "'"
exec(cexpr)
C'est dans le cadre d'un script Sys V sous CUPS.

Merci beaucoup.

--
Bientôt, Apple ne va plus que fournir les plans sous microfilms coincés
sur le proc : le but sera de les en déloger avant d'allumer la machine,
sinon ça fond ! Comme à Fort Boyard...
-+- SP in Guide du Macounet Pervers :The name is Bond, James Bond -+-
Damien Wyart
Le #25709442
* Eric Masson
Je m'en suis sorti avec une variante de la première solution :
for e in sys.argv[5].replace("-","_").split():
expr = e.split('=')
cexpr = expr[0] + "='" + expr[1] + "'"
exec(cexpr)
C'est dans le cadre d'un script Sys V sous CUPS.



Avec exec et eval, il faut surtout faire attention aux problèmes de
sécurité : la chaîne passée à exec ne doit pas contenir de commandes
dangereuses, et il faut donc la "nettoyer" si elle provient d'entrées
utilisateur.

--
DW
Eric Masson
Le #25709672
Damien Wyart
'Re,

Avec exec et eval, il faut surtout faire attention aux problèmes de
sécurité : la chaîne passée à exec ne doit pas contenir de commandes
dangereuses, et il faut donc la "nettoyer" si elle provient d'entrées
utilisateur.



On est d'accord, il faudrait effectivement valider qu'il s'agit bien de
ce que j'attends, à savoir des couples nom/valeur, si tu as une idée ou
un lien sur le sujet, je suis preneur.

Dans le cas présent, il s'agit de couples variable/valeur positionnés
par CUPS.

--
J'ai essayé de creer un news un alt.west.virginia ou sur d'autres
alt.west.wirginia.xxx mais quand je vais sur ces forums rien n'apparait?
l'emetteur d'un new recoit il un avertissement si celui ci est censuré?
-+- LM in:
Damien Wyart
Le #25710032
* Eric Masson
On est d'accord, il faudrait effectivement valider qu'il s'agit bien
de ce que j'attends, à savoir des couples nom/valeur, si tu as une
idée ou un lien sur le sujet, je suis preneur.

Dans le cas présent, il s'agit de couples variable/valeur positionnés
par CUPS.



Un petit contrôle via expression régulière devrait être suffisant, je
pense, mais si la valeur est potentiellement exotique (chemins, noms de
commandes), tu ne pourras pas forcément être très strict ; il faut que
tu regardes quelles valeurs vont être utilisées. Une autre pistes est de
regarder comment sera appelé ton code qui utilise exec et s'il y a une
possible "injection" dans la valeur de certaines variables.

--
DW
Eric Masson
Le #25718372
Damien Wyart
'Lut,

Un petit contrôle via expression régulière devrait être suffisant, je
pense, mais si la valeur est potentiellement exotique (chemins, noms de
commandes), tu ne pourras pas forcément être très strict ; il faut que
tu regardes quelles valeurs vont être utilisées. Une autre pistes est de
regarder comment sera appelé ton code qui utilise exec et s'il y a une
possible "injection" dans la valeur de certaines variables.



Ok, le contrôle par regex sera suffisant, il s'agit des valeurs passées
par CUPS en tant que paramètre options d'un script d'interface style
System V.

Merci pour ton aide.

--
YC> Bonjour amis de la cuisine..
YC> Je recherche la recette du coq au vin, pour un amis.
Amitiés
-+- IH in
Publicité
Poster une réponse
Anonyme