Gostaria de poder obter o nome de uma variável como uma string, mas não sei se o Python tem tantos recursos de introspecção. Algo como:
>>> print(my_var.__name__)
'my_var'
Quero fazer isso porque tenho várias variáveis que gostaria de transformar em um dicionário como:
bar = True
foo = False
>>> my_dict = dict(bar=bar, foo=foo)
>>> print my_dict
{'foo': False, 'bar': True}
Mas eu gostaria de algo mais automático que isso.
Python tem locals()
e vars()
, então eu acho que existe um caminho.
Respostas:
Você está tentando fazer isso?
Exemplo
fonte
print('x: ' + x)
um, possa escrevermagic_print(x)
e ter a mesma saída sem escrever o nome da variável duas vezes.Como o desenrolador disse, isso não é realmente algo que você faz no Python - as variáveis são, na verdade, mapeamentos de nomes para objetos.
No entanto , aqui está uma maneira de tentar fazê-lo:
fonte
True
), um nome de variável não intencional poderá ser retornado.id(v) == id(a)
invés dev is a
? Isso falhará para objetos vinculados a várias variáveis, como ints, strings e quaisquer tipos definidos pelo usuário implementados de maneira semelhante.v is a
seria uma escolha melhor. E sim, certamente perigoso, considerando todas as armadilhas potenciais que podem surgir! ;-)Eu queria fazer isso bastante. Esse hack é muito parecido com a sugestão de rlotun, mas é uma linha, o que é importante para mim:
Python 3+
fonte
iteritems()
é substituído poritems()
spam = 1; blah = 1; blah_name = [ k for k,v in locals().items() if v is blah][0]; print(blah_name)
Saídasspam
spam = 1, blah = 1; assert spam is blah
. A solução é interrompida ao comparar tipos de dados primitivos.Isso é um truque. Não funcionará em todas as distribuições de implementações Python (em particular, aquelas que não possuem
traceback.extract_stack
).Observe que esse hack é frágil:
(chamar make_dict em 2 linhas) não funcionará.
Em vez de tentar gerar o dict a partir dos valores
foo
ebar
, seria muito mais Pythonic gerar o dict a partir dos nomes de variáveis da string'foo'
e'bar'
:fonte
print("a_very_long_name: {}'.format(a_very_long_name))
quem se importa!Isso não é possível no Python, que realmente não tem "variáveis". Python tem nomes e pode haver mais de um nome para o mesmo objeto.
fonte
Acho que meu problema ajudará a ilustrar por que essa pergunta é útil e pode fornecer um pouco mais de insight sobre como respondê-la. Eu escrevi uma pequena função para fazer uma verificação rápida em linha em várias variáveis no meu código. Basicamente, ele lista o nome da variável, tipo de dados, tamanho e outros atributos, para que eu possa detectar rapidamente os erros que cometi. O código é simples:
Portanto, se você tiver uma situação complicada de dicionário / lista / tupla, seria bastante útil que o intérprete retornasse o nome da variável que você atribuiu. Por exemplo, aqui está um dicionário estranho:
Não tenho certeza se coloco isso no lugar certo, mas achei que poderia ajudar. Espero que sim.
fonte
myconnection
poderia estar apontando para um valor booleano em um ponto, um número inteiro em outro momento e uma conexão de soquete em outro ponto na execução do código?Escrevi uma pequena função útil, baseada na resposta a esta pergunta. Estou colocando aqui caso seja útil.
uso:
fonte
Acho que, se você já possui uma lista específica de valores, é assim descrito por @S. Lotts é o melhor; no entanto, a maneira descrita abaixo funciona bem para obter todas as variáveis e classes adicionadas ao longo do código SEM a necessidade de fornecer o nome da variável, embora você possa especificá-las, se desejar. O código pode ser estendido para excluir Classes.
Resultado:
fonte
No python 3 isso é fácil
isto imprimirá:
fonte
for v in locals()
.for v in list(locals()):
Python3. Use inspecionar para capturar o espaço para nome local de chamada e use as idéias apresentadas aqui. Pode retornar mais de uma resposta, conforme indicado.
fonte
Aqui está a função que eu criei para ler os nomes das variáveis. É mais geral e pode ser usado em diferentes aplicações:
Para usá-lo na pergunta especificada:
fonte
Ao ler o tópico, vi muitos atritos. É fácil dar uma resposta ruim e deixar alguém dar a resposta correta. Enfim, aqui está o que eu encontrei.
De: [effbot.org] ( http://effbot.org/zone/python-objects.htm#names )
Os nomes são um pouco diferentes - eles não são realmente propriedades do objeto, e o próprio objeto não sabe como é chamado.
Um objeto pode ter qualquer número de nomes ou nenhum nome.
Os nomes vivem em espaços para nome (como um espaço para nome do módulo, um espaço para nome da instância, o espaço para nome local da função).
Nota: que ele diz que o objeto em si não sabe como é chamado , então essa foi a pista. Objetos Python não são auto-referenciais. Depois, diz: Nomes vivem em espaços para nome . Temos isso em TCL / TK. Talvez minha resposta ajude (mas me ajudou)
Portanto, há 'jj' no final da lista.
Reescreva o código como:
Essa parte desagradável do código é o nome da variável / objeto / seja lá o que você pedantics chamar.
Então aí está. O endereço de memória de 'jj' é o mesmo quando o procuramos diretamente, como quando procuramos no dicionário no espaço de nomes global. Tenho certeza que você pode fazer uma função para fazer isso. Lembre-se de qual namespace sua variável / objeto / wypci está.
QED.
fonte
print id(jj)
. O segundo simplesmente pesquisa o nome e pode ser feito mais facilmentevars()
.Talvez eu esteja pensando demais nisso, mas ..
fonte
variable = 1 \n [k for k,v in locals().items() if id(variable) == id(v)] \n Out[14]: ['variable']
fonte
Fiz upload de uma solução para o pypi . É um módulo que define um equivalente da
nameof
função do C # .Ele itera através das instruções do bytecode para o quadro em que é chamado, obtendo os nomes das variáveis / atributos passados para ele. Os nomes são encontrados no
.argrepr
deLOAD
instruções seguinte nome da função.fonte
Eu escrevi a feitiçaria de pacotes para fazer esse tipo de mágica de maneira robusta. Você pode escrever:
fonte
A maioria dos objetos não possui um atributo __name__ . (Classes, funções e módulos possuem; mais tipos internos que possuem um?)
O que mais você esperaria
print(my_var.__name__)
além deprint("my_var")
? Você pode simplesmente usar a string diretamente?Você pode "cortar" um ditado:
Alternativamente:
fonte
some_func(var)
, então tentei ressaltar que não há muito longesome_func("var")
, com o dictslice permitindo que você obtenha o mapeamento de nome-valor para várias variáveis ao mesmo tempo.Bem, encontrei a mesma necessidade há alguns dias e tive que obter o nome de uma variável que apontava para o próprio objeto .
E por que era tão necessário?
Em resumo, eu estava construindo um plug-in para o Maya . O plug-in principal foi criado usando C ++, mas a GUI é desenhada através do Python (pois não exige muito processador). Como ainda não sei como
return
múltiplos valores do plug-in, exceto o padrãoMStatus
, portanto, para atualizar um dicionário em Python, tive que passar o nome da variável, apontando para o objeto que implementa a GUI e qual continha o próprio dicionário no plug-in e, em seguida, use oMGlobal::executePythonCommand()
para atualizar o dicionário a partir do escopo global do Maya .Para fazer isso, o que eu fiz foi algo como:
Eu sei que não é a solução perfeita nas
globals
muitas chaves que podem estar apontando para o mesmo objeto, por exemplo:e que a abordagem não é segura para threads. Corrija-me se eu estiver errada.
Pelo menos essa abordagem resolveu meu problema, obtendo o nome de qualquer variável no escopo global que apontava para o próprio objeto e o passava para o plug-in, como argumento, para uso interno.
Eu tentei isso
int
(a classe inteira primitiva), mas o problema é que essas classes primitivas não são ignoradas (corrija a terminologia técnica usada se estiver errada). Você pode reimplementarint
e depois fazer,int = foo
masa = 3
nunca será um objetofoo
senão o primitivo. Para superar que você tem quea = foo(3)
chegara.name()
ao trabalho.fonte
Com o python 2.7 e mais recente, também há compreensão de dicionário, o que o torna um pouco mais curto. Se possível, eu usaria getattr em vez de eval (eval é mau) como na resposta superior. O eu pode ser qualquer objeto que tenha o contexto que você está olhando. Pode ser um objeto ou locals = locals () etc.
fonte
Eu estava trabalhando em um problema semelhante. @ S.Lott disse "Se você tem a lista de variáveis, qual é o sentido de" descobrir "os nomes deles?" E minha resposta é apenas para ver se isso poderia ser feito e se, por algum motivo, você deseja classificar suas variáveis por tipo em listas. De qualquer forma, em minha pesquisa, me deparei com esse segmento e minha solução é um pouco expandida e é baseada na solução @rlotun. Outra coisa, @unutbu disse: "Essa ideia tem mérito, mas observe que, se dois nomes de variáveis fizerem referência ao mesmo valor (por exemplo, True), um nome de variável não intencional poderá ser retornado". Neste exercício, que era verdade, então eu lidei com isso usando uma compreensão lista semelhante a este para cada possibilidade:
isClass = [i for i in isClass if i != 'item']
. Sem ele "item" apareceria em cada lista.fonte
pi = pie
ao seu código e obteria uma entrada extra na suaisFloat
lista. Se você adicionoutuple_1[0]
à suamixedDataTypes
lista, nenhum nome será encontrado, apesar de "um" estar no seu código duas vezes (embora, graças à cadeia de caracteres interna, ambos sejam referências ao mesmo objeto).pi
ee
como variáveis causava saída indesejada e isso ocorre porque ambos fazem parte damath
biblioteca. Para mim, este foi apenas um exercício para ver se poderia ser feito, mesmo que o resultado final não seja perfeito. No meu aprendizado dessa língua, passar por livros só vai tão longe. Na minha opinião, se você realmente quer aprender o idioma, precisa tocar "what if" e ver o que você propõe.você pode usar o easydict
outro exemplo:
fonte
No python3, essa função obterá o nome mais externo da pilha:
É útil em qualquer lugar do código. Atravessa a pilha invertida procurando a primeira correspondência.
fonte
Embora essa seja provavelmente uma péssima idéia, ela segue as mesmas linhas da resposta de rlotun, mas retornará o resultado correto com mais frequência.
Você chama assim:
fonte
deve obter a lista e retornar
fonte
Ele não retornará o nome da variável, mas você pode criar dicionário a partir da variável global facilmente.
fonte
Com
python-varname
você pode facilmente fazê-lo:pip install python-varname
Isenção de responsabilidade: sou o autor dessa biblioteca python-varname.
fonte
dessa forma, obtenha varname para um talvez 'a' ou 'b'.
fonte