Oto jedno podejście. Nie polecałbym tego do niczego ważnego, ponieważ będzie dość kruchy. Ale da się to zrobić.
Utwórz funkcję, która używa inspectmodułu, aby znaleźć kod źródłowy, który ją wywołał. Następnie możesz przeanalizować kod źródłowy, aby zidentyfikować nazwy zmiennych, które chcesz pobrać. Na przykład, oto funkcja o nazwie, autodictktóra pobiera listę zmiennych i zwraca słownik mapujący nazwy zmiennych na ich wartości. Na przykład:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
Dałby:
{'x': 'foo', 'y': 'bar'}
Sprawdzanie samego kodu źródłowego jest lepsze niż przeszukiwanie locals()lub, globals()ponieważ to drugie podejście nie mówi ci, które zmienne są tymi, które chcesz.
W każdym razie oto kod:
def autodict(*args):
get_rid_of = ['autodict(', ',', ')', '\n']
calling_code = inspect.getouterframes(inspect.currentframe())[1][4][0]
calling_code = calling_code[calling_code.index('autodict'):]
for garbage in get_rid_of:
calling_code = calling_code.replace(garbage, '')
var_names, var_values = calling_code.split(), args
dyn_dict = {var_name: var_value for var_name, var_value in
zip(var_names, var_values)}
return dyn_dict
Akcja ma miejsce w wierszu z inspect.getouterframes, który zwraca ciąg w wywołanym kodzie autodict.
Oczywistą wadą tego rodzaju magii jest to, że przyjmuje założenia dotyczące struktury kodu źródłowego. I oczywiście to w ogóle nie zadziała, jeśli jest uruchomione wewnątrz tłumacza.
pip3 install python-varname==0.1.5; zaimportowane za pomocąfrom varname import nameof