Aqui está uma abordagem. Eu não recomendaria isso por nada importante, porque será bastante quebradiço. Mas isto pode ser feito.
Crie uma função que use o inspect
módulo para encontrar o código-fonte que o chamou. Em seguida, você pode analisar o código-fonte para identificar os nomes das variáveis que deseja recuperar. Por exemplo, aqui está uma função chamada autodict
que pega uma lista de variáveis e retorna um dicionário mapeando nomes de variáveis para seus valores. Por exemplo:
x = 'foo'
y = 'bar'
d = autodict(x, y)
print d
Daria:
{'x': 'foo', 'y': 'bar'}
Inspecionar o código fonte em si é melhor do que pesquisar na locals()
ou globals()
porque a última abordagem não informa quais variáveis são as desejadas.
De qualquer forma, aqui está o código:
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
A ação acontece na linha com inspect.getouterframes
, que retorna a string no código que chamou autodict
.
A desvantagem óbvia para esse tipo de mágica é que ela faz suposições sobre como o código-fonte é estruturado. E, é claro, não funcionará se for executado dentro do intérprete.
pip3 install python-varname==0.1.5
; importado usandofrom varname import nameof