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

Définition de fonction via execfile

2 réponses
Avatar
Eric Masson
'Lut,

Soit une application (un filtre dans le cadre d'un système d'impression
type BSD), contenue dans un seul fichier source, en fonction de
paramètres reçus dans stdin, je dois récupérer des définitions de
fonction dans des fichiers sources externes :

<filtre.py>
def traitement (file, parms):
# blah, blah, blah
# traitement divers et variés sur file
# et création d'un objet quelconque c
if parms['overlay'] <> '' :
fonction_definie_ailleurs(c)

def main():

parameters={}

# Récupération paramètres
textfile, parameters = retrieve_spool_parameters(spoolfile)

# Execution fichier si le paramètre existe
if parameters['overlay'] <> '' :
overlay = '/data/overlays/' + parameters['overlay'] + '.py'
execfile(overlay)

# Traitement
traitement(textfile, parameters)

if __name__ == "__main__":
main()
</filtre.py>

<definition.py>
def fonction_definie_ailleurs(c)
# blah, blah, blah
# Traitement sur c si le paramètre overlay dans stdin était
# definition
</definition.py>

<definition2.py>
def fonction_definie_ailleurs(c)
# blah, blah, blah
# Traitement sur c si le paramètre overlay dans stdin était
# definition2
</definition2.py>

Tant que l'on reste dans la portée de main, fonction définie ailleurs
est définie et connue de l'interpréteur, par contre, l'appel depuis
traitement échoue (changement de portée)

Donc, la question maintenant, est-il possible de contourner ce
comportement et de faire en sorte que fonction_definie_ailleurs soit
définie globalement dans filtre.py et que son code soit chargé
ultérieurement à partir d'un fichier source externe ?

Ou alors est-ce que je devrais me mettre au tricot ?

Merci d'avance

--
D'ailleurs, je me demande a quoi cela sert de "quoter" le texte d'un
autre puisqu'un article a toujours la reference de celui auquel il
repond. Et puis, il y a dejanews.... alors....
-+- CB in: <http://www.le-gnu.net> - T'avais qu'à suivre -+-

2 réponses

Avatar
Méta-MCI
Bonsoir !

En fait, à l'intérieur d'une fonction, tu veux définir une fonction globale.
Il faut alors adresser directement globals()

Exemple :

def ff():
print '00ff'
return '00ff'

def f():
def ff():
print 'ff'
return 'ff'
ff()
globals()['ff']ÿ
print 'f'
return 'f'

ff()
f()
ff()




@+

MCI
Avatar
Eric Masson
"Méta-MCI" writes:

'Lut,

En fait, à l'intérieur d'une fonction, tu veux définir une fonction globale.
Il faut alors adresser directement globals()


Ok, je n'avais pas pensé à ça pour les fonctions.

Exemple :

def ff():
print '00ff'
return '00ff'

def f():
def ff():
print 'ff'
return 'ff'
ff()
globals()['ff']ÿ
print 'f'
return 'f'

ff()
f()
ff()


Je teste quelque chose dans cet esprit dès que possible.

Merci

--
Ce message de Marc n'avait rien à faire sur ma boite privé sans MON
autorisation s'il le fait c'est à ses risques et périls, il a gravement
violé la nétiquette, un prêté pour un rendu.
-+- 0QI in GNU : J'irais bien refaire un tour du côté de chez spam -+-