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

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

6 réponses
Avatar
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 ! -+-

6 réponses

Avatar
Damien Wyart
* Eric Masson in fr.comp.lang.python:
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
Avatar
Eric Masson
Damien Wyart writes:

'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 -+-
Avatar
Damien Wyart
* Eric Masson in fr.comp.lang.python:
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
Avatar
Eric Masson
Damien Wyart writes:

'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: <http://www.le-gnu.net> - Bien sansurer ses news sur C-I -+-
Avatar
Damien Wyart
* Eric Masson in fr.comp.lang.python:
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
Avatar
Eric Masson
Damien Wyart writes:

'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 <http://www.le-gnu.net> : Neuneu poste en vin.