Python Forum
problem using exec to save local variables - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: problem using exec to save local variables (/thread-22879.html)



problem using exec to save local variables - dkarl - Dec-01-2019

Hi everyone.
i'm trying to use the exec() function to be able to save variables defined between two editor lines in such a way:
###
exec(string_to_get_local_variables_into_a_dictionary)
a=1
b=2
...
exec(string_to_get_local_variables_again_and_get_the_difference_between_this_current_dictionary_and_previous_one)
###
in order to get the above strings i've created two functions: save_tic(), save_toc().
however something weird happens -
1. when i simply execute - exec(save_toc()) doesn't work and it says i haven't defined variables which i did
2. when i debug to that point, manually return the string from save_toc() and execute it then it DOES work.
does anybody know what's going on?

###################################################
### Functions: ####
def save_tic(baseline_name_finale):
    get_baseline_variables_str = '_baseline_variables = locals().copy()\n' \
                                   '_baseline_variables_keys = list(_baseline_variables.keys())\n' \
                                   '_baseline_variables_values = list(_baseline_variables.values())\n' \
                                   '_baseline_variables_keys_set' + str(baseline_name_finale) + ' = set(_baseline_variables_keys)\n'
    return get_baseline_variables_str;


def save_toc(base_finale, post_finale, prefix_to_delete=None):
    saved_dictionary_name = 'saved_dictionary' + str(post_finale)

    execution_string = '_final_variables = locals().copy();\n' \
        '_final_variables_keys = list(_final_variables.keys());\n' \
        '_final_variables_values = list(_final_variables.values());\n' \
        '_final_variables_keys_set = set(_final_variables_keys);\n' \
        'final_variables_dictionary = dict();\n' \
        'for k,v in zip(_final_variables_keys,_final_variables_values):\n' \
        '    final_variables_dictionary[k] = v;\n' \
        'relevant_keys_set = _final_variables_keys_set ^ _baseline_variables_keys_set' + str(base_finale) + ';\n' \
        'relevant_keys_set = [element for element in relevant_keys_set if element.startswith(\'_\')==False]\n' \
        'relevant_keys_set = list(relevant_keys_set);\n'   \
        'relevant_keys_set_modified = relevant_keys_set.copy(); \n' \
        'for i in range(0,len(relevant_keys_set_modified),1): \n' \
        '   if relevant_keys_set_modified[i].split(\'_\')[0]==\'' + str(prefix_to_delete) + '\': \n' \
        '        joint_string = \' \'; \n'  \
        '        string_list = relevant_keys_set_modified[i].split(\'_\')[1:] \n' \
        '        for i in range(0, len(string_list), 1): \n' \
        '            if i > 0: \n'  \
        '                joint_string += \'_\'; \n' \
        '            joint_string += string_list[i]; \n' \
        '        relevant_keys_set_modified[i] = joint_string \n' \
        'saved_dictionary' + str(post_finale) + ' = EasyDict() \n' \
        'for key_modified,key_original in zip(relevant_keys_set_modified,relevant_keys_set): \n' \
        '   saved_dictionary' + str(post_finale) + '[key_modified]=final_variables_dictionary[key_original] \n'
    
     return execution_string 
###################################################


###################################################
def some_function():
   exec(save_tic(1))
   a = 1
   b = 1
   exec(save_toc(1,1))  #suppose to finally return a variable called "saved_dictionary1" which has: saved_dictionary1={'a':1, 'b':1'}
   return saved_dictionary1

if __name__ == "__main__":
    variables_in_function = some_function()
###################################################