Si vous voulez que la réponse acceptée abstraire à la fonction que vous pouvez utiliser:
import shelve
def save_workspace(filename, names_of_spaces_to_save, dict_of_values_to_save):
'''
filename = location to save workspace.
names_of_spaces_to_save = use dir() from parent to save all variables in previous scope.
-dir() = return the list of names in the current local scope
dict_of_values_to_save = use globals() or locals() to save all variables.
-globals() = Return a dictionary representing the current global symbol table.
This is always the dictionary of the current module (inside a function or method,
this is the module where it is defined, not the module from which it is called).
-locals() = Update and return a dictionary representing the current local symbol table.
Free variables are returned by locals() when it is called in function blocks, but not in class blocks.
Example of globals and dir():
>>> x = 3 #note variable value and name bellow
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'x': 3, '__doc__': None, '__package__': None}
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'x']
'''
print 'save_workspace'
print 'C_hat_bests' in names_of_spaces_to_save
print dict_of_values_to_save
my_shelf = shelve.open(filename,'n') # 'n' for new
for key in names_of_spaces_to_save:
try:
my_shelf[key] = dict_of_values_to_save[key]
except TypeError:
#
# __builtins__, my_shelf, and imported modules can not be shelved.
#
#print('ERROR shelving: {0}'.format(key))
pass
my_shelf.close()
def load_workspace(filename, parent_globals):
'''
filename = location to load workspace.
parent_globals use globals() to load the workspace saved in filename to current scope.
'''
my_shelf = shelve.open(filename)
for key in my_shelf:
parent_globals[key]=my_shelf[key]
my_shelf.close()
an example script of using this:
import my_pkg as mp
x = 3
mp.save_workspace('a', dir(), globals())
pour obtenir/charger l'espace de travail:
import my_pkg as mp
x=1
mp.load_workspace('a', globals())
print x #print 3 for me
cela a fonctionné quand je l'ai couru. Je vais admettre que je ne comprends pas dir()
et globals()
100% donc je ne suis pas sûr s'il pourrait y avoir une mise en garde étrange, mais jusqu'à présent, il semble fonctionner. Les commentaires sont les bienvenus :)
après quelques recherches si vous appelez save_workspace
comme je l'ai suggéré avec et globals save_workspace
est dans une fonction, il ne fonctionnera pas comme prévu si vous souhaitez enregistrer les veriables dans une portée locale. Pour cela utiliser locals()
. Cela arrive parce que les globals prennent les globals du module où la fonction est définie, pas d'où elle s'appelle serait ma conjecture.
Parfait. C'est ce que je cherchais. BTW, je trouve cette phrase dans votre message super drôle: "Pour mettre votre travail à l'écart" :) – user10
Et là, je pensais que "cornichons" étaient drôles! :) http://en.wikipedia.org/wiki/Inherently_funny_word – unutbu
est-il possible d'abstraire les détails de l'enregistrement des variables dans une fonction séparée? Par exemple, lorsque vous faites défiler les noms dans l'espace de nom local actuel, vous pouvez le passer en argument, mais comment passez-vous les globals? Avez-vous aussi besoin de passer les globals? comme dans 'save (dir(), globals())', puis exécutez votre code ci-dessus? Aussi est-il possible de simplement appeler une fonction qui abstrait de restauration? – Pinocchio