Forum: Poser Python Scripting


Subject: Useful Code Snippets

structure opened this issue on Jun 27, 2019 ยท 94 posts


structure posted Mon, 25 October 2021 at 3:35 AM Forum Coordinator

store dictionary names in a list, and retrieve them as a printable string 

def varname(var):
    import inspect
    frame = inspect.currentframe()
    var_id = id(var)
    for name in frame.f_back.f_locals.keys():
        try:
            if id(eval(name)) == var_id:return(name)
        except:return var

cmra_data,char_data, face_data, hand_data = {}, {}, {}, {}
hair_data, lite_data, mtrl_data, pose_data = {}, {}, {}, {}
prop_data =  {}

alldicts = [cmra_data, char_data, face_data, hand_data,
            hair_data, lite_data, mtrl_data, pose_data,
            prop_data,]

count = 0
for dictionary in alldicts:
    print(f"Dictionary {count} Name : {varname(dictionary)}")
    count += 1

output : 
Dictionary 0 Name : cmra_data
Dictionary 1 Name : char_data
Dictionary 2 Name : face_data
Dictionary 3 Name : hand_data
Dictionary 4 Name : hair_data
Dictionary 5 Name : lite_data
Dictionary 6 Name : mtrl_data
Dictionary 7 Name : pose_data
Dictionary 8 Name : prop_data

This script allows you to store dictionary names as strings :
useful if you need to print the dictionary name for debugging
or just to let the user know which dictionary is being accessed.

** NOTE @ it does not work for :
    alldicts = [{} for _ in range(9)]
    since alldicts has no named dictionaries inside

For which; the output becomes :
Dictionary 0 Name : dictionary
Dictionary 1 Name : dictionary
Dictionary 2 Name : dictionary
Dictionary 3 Name : dictionary
Dictionary 4 Name : dictionary
Dictionary 5 Name : dictionary
Dictionary 6 Name : dictionary
Dictionary 7 Name : dictionary
Dictionary 8 Name : dictionary

Locked Out