2017-10-19 5 views
1

Y at-il un bon moyen de reproduire le code suivant pour utiliser une seule instruction with:Comment gérer le nombre dynamique d'éléments avec une instruction?

thing1 = Thing() 
if two_things: 
    thing2 = Thing() 

do_stuff(thing1) 

if two_things: 
    do_stuff(thing2) 

thing1.close() 
if two_things: 
    thing2.close() 

je peux utiliser 2 séparée avec des clauses, mais cela est assez mauvais si beaucoup de code est partagé entre les deux cas.

if two_things: 
    with Thing() as thing1, Thing() as thing2: 
     do_stuff(thing1) 
     do_stuff(thing2) 

else: 
    with Thing() as thing: 
     do_stuff(thing1) 

Répondre

2

"Supporting a variable number of context managers"

La principale utilisation pour ExitStack est celle donnée dans la documentation de la classe: le soutien d'un nombre variable de gestionnaires de contexte et d'autres opérations de nettoyage dans une seule instruction with. La variabilité peut provenir du nombre de gestionnaires de contexte nécessaire entraîné par l'entrée d'utilisateur (comme l'ouverture d'une collection spécifiée par l'utilisateur des fichiers), ou de certains des gestionnaires de contexte étant facultatif:

with ExitStack() as stack: 
    for resource in resources: 
     stack.enter_context(resource) 
    if need_special_resource(): 
     special = acquire_special_resource() 
     stack.callback(release_special_resource, special) 
    # Perform operations that use the acquired resources