2017-08-17 2 views
-2

Parfois, quand j'exécute une fonction dans mon script python et si la fonction me donne une sortie qui n'est pas désirée, je dois annuler cette étape et essayer de réexécuter la fonction avec différents paramètres. Est-il possible que le script annule ce qu'il a fait si ma fonction me donne une mauvaise sortie? Pour un seul ensemble de paramètres, la sortie désirée est obtenue. PS: En exécutant la fonction signifie effectuer des modifications permanentes.Python - Annuler le script si le script échoue

Exemple:

def function(): 
    for i in range(parameters): 
     value = perform_operation(parameters[i]) #makes permanent changes 
     if value != some_value: 
      undo(perform_operation()) 
+0

Pouvez-vous donner un exemple d'une telle fonction? Si vous obtenez systématiquement (ou souvent assez) une mauvaise sortie, la fonction peut être incorrecte. Si ce n'est pas le cas, vérifiez simplement l'exactitude de votre sortie avec un 'if' comme ceci:' if not correct_output: your_function (new_input) '. Donne aussi un exemple de la sortie, en fonction de ce que ta sortie ressemble à un démontage, c'est très différent. – Lomtrur

+1

Que voulez-vous dire par "défaire ce qu'il a fait"? Peut-être que vous pouvez le faire par une clause 'try' -' except', en levant une exception dans 'try' et annuler les changements sur' except' –

+0

Utilisez simplement une instruction conditionnelle? 'si quelque chose: value = perform_operation() elif something_else: value = whatevs ...' –

Répondre

1

Vous devez créer une autre fonction que nettoie ce qui a été fait dans la fonction principale par exemple (supprimer les fichiers nouvellement créés, supprimer les packages installés, etc ...) et l'utiliser.

def main_func(): 
    proc = subprocess.Popen('touch test test2') 
    return proc.returncode 

def clean_main_func(): 
    subprocess.Popen('rm test test2') 


def __name__ == '__main__': 
    result = main_func() 
    if main_func() != 0 : 
     clean_main_func() 

ou vous pouvez soulever une erreur puis l'attraper:

def main_func(): 
    proc = subprocess.Popen('touch test test2') 
    if proc.returncode !=0 : 
     raise Error 

def clean_main_func(): 
    subprocess.Popen('rm test test2') 


def __name__ == '__main__': 
    try: 
     result = main_func() 
    except Error: 
     clean_main_func() 

Il est juste un exemple, et nous espérons qu'elle répond à votre question.