Então, o que estou procurando aqui é algo como a função print_r do PHP .
Isso é para que eu possa depurar meus scripts vendo qual é o estado do objeto em questão.
Então, o que estou procurando aqui é algo como a função print_r do PHP .
Isso é para que eu possa depurar meus scripts vendo qual é o estado do objeto em questão.
Você está realmente misturando duas coisas diferentes.
Use dir()
, vars()
ou o inspect
módulo para conseguir o que você está interessado em (eu uso __builtins__
como um exemplo, você pode usar qualquer objeto em seu lugar).
>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__
Imprima esse dicionário da maneira que desejar:
>>> print l
['ArithmeticError', 'AssertionError', 'AttributeError',...
ou
>>> from pprint import pprint
>>> pprint(l)
['ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
>>> pprint(d, indent=2)
{ 'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
...
'_': [ 'ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'DeprecationWarning',
...
A impressão bonita também está disponível no depurador interativo como um comando:
(Pdb) pp vars()
{'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
'BaseException': <type 'exceptions.BaseException'>,
'BufferError': <type 'exceptions.BufferError'>,
...
'zip': <built-in function zip>},
'__file__': 'pass.py',
'__name__': '__main__'}
__dict__
membro (re.MatchObject
por exemplo), mas o builtindir()
funciona para todos os objetos.print re.compile(r'slots').search('No slots here either.').__slots__
inspect
módulo em sua resposta? Eu acho que é a coisa mais próxima de print_r ou var_dump.dir()
, então?dir()
retorna apenas uma lista de nomes e nem todos existem novars()
ou no__dict__
atributoVocê quer
vars()
misturado compprint()
:fonte
vars()
simplesmente retorna o__dict__
argumento e esse também é o substitutodir()
no caso de não haver__dir__
método. então usedir()
em primeiro lugar, como eu disse.dir()
fornece todas as coisas incorporadas que você provavelmente não gosta__str__
e gosta__new__
.var()
não.__dict__
atributo.Existem muitas funções de terceiros por aí que adicionam itens como tratamento de exceções, impressão de caracteres nacionais / especiais, recorrência em objetos aninhados etc. de acordo com as preferências de seus autores. Mas todos eles basicamente se resumem a isso.
fonte
getmembers()
função noinspect
módulo padrão , mas achei que isso seria mais útil, pois ilustra como fazer a introspecção em geral.__dict__
(como__doc__
e__module__
). Além disso,__dict__
não funciona para objetos declarados com__slots__
. Em geral,__dict__
mostra propriedades no nível do usuário que são realmente armazenadas internamente em um dicionário. dir () mostra mais.__dict__
atributo / membro. Eu sei que é loucura, mas é verdade. Built-ins comoint
estr
oure.MatchObject
s são exemplos comuns. Tente'hello'.__dict__
, então tentedir('hello')
dir foi mencionado, mas isso fornecerá apenas os nomes dos atributos. Se você quiser os valores deles, tente __dict__.
Aqui está a saída:
fonte
set
não tem__dict__
, por isso, para eles ele falhará comAttributeError: 'set' object has no attribute '__dict__'
Você pode usar a função "dir ()" para fazer isso.
Outro recurso útil é a ajuda.
fonte
Para imprimir o estado atual do objeto, você pode:
ou
ou
Para suas classes, defina
__str__
ou__repr__
métodos. Na documentação do Python :fonte
print "DEBUG: object value: " + repr(obj)
Pode valer a pena conferir --
Existe um Python equivalente ao Data :: Dumper do Perl?
Minha recomendação é esta -
https://gist.github.com/1071857
Observe que o perl possui um módulo chamado Data :: Dumper, que converte os dados do objeto de volta ao código-fonte perl (NB: NÃO converte o código de volta ao código-fonte, e quase sempre você não deseja que o método de objeto funcione na saída). Isso pode ser usado para persistência, mas o objetivo comum é a depuração.
Há várias coisas que o python pprint padrão não consegue, em particular, ele apenas para de descer quando vê uma instância de um objeto e fornece o ponteiro hexadecimal interno do objeto (errr, esse ponteiro não é muito usado por o caminho). Então, em poucas palavras, python é tudo sobre esse ótimo paradigma orientado a objetos, mas as ferramentas que você obtém da caixa são projetadas para trabalhar com algo diferente de objetos.
O perl Data :: Dumper permite controlar a profundidade que você deseja ir e também detecta estruturas circulares vinculadas (isso é realmente importante). Esse processo é fundamentalmente mais fácil de ser realizado em perl, porque os objetos não têm mágica em particular além de suas bênçãos (um processo universalmente bem definido).
fonte
Eu recomendo usar
help(your_object)
.help(dir)
help(vars)
fonte
Na maioria dos casos, usar
__dict__
oudir()
obterá as informações desejadas. Se precisar de mais detalhes, a biblioteca padrão inclui o módulo de inspeção , que permite obter uma quantidade impressionante de detalhes. Alguns dos verdadeiros nuggests de informações incluem:Se você está apenas procurando "quais valores de atributo meu objeto possui?", Então
dir()
e__dict__
provavelmente são suficientes. Se você está realmente procurando cavar o estado atual de objetos arbitrários (tendo em mente que em python quase tudo é um objeto), entãoinspect
é digno de consideração.fonte
Não. A resposta mais votada exclui alguns tipos de atributos e a resposta aceita mostra como obter todos os atributos, incluindo métodos e partes da API não pública. Mas não há nenhuma boa completo builtin função para isso.
Portanto, o corolário curto é que você pode escrever seu próprio, mas ele calculará propriedades e outros descritores de dados calculados que fazem parte da API pública, e talvez você não queira isso:
Problemas com outras respostas
Observe a aplicação da resposta atualmente mais votada em uma classe com muitos tipos diferentes de membros de dados:
apenas imprime:
Como retorna
vars
apenas o__dict__
de um objeto e não é uma cópia, por isso, se você modificar o ditado retornado por vars, também estará modificando o__dict__
próprio objeto.retorna:
- o que é ruim porque o quux é uma propriedade que não devemos definir e não deve estar no espaço para nome ...
A aplicação do conselho na resposta atualmente aceita (e outras) não é muito melhor:
Como podemos ver,
dir
apenas retorna todos (na verdade, apenas a maioria) dos nomes associados a um objeto.inspect.getmembers
, mencionado nos comentários, é igualmente falho - retorna todos os nomes e valores.Da classe
Ao ensinar, meus alunos criam uma função que fornece a API semanticamente pública de um objeto:
Podemos estender isso para fornecer uma cópia do espaço de nomes semântico de um objeto, mas precisamos excluir os
__slots__
que não foram atribuídos e, se levarmos a sério o pedido de "propriedades atuais", precisamos excluir as propriedades calculadas (como eles podem se tornar caros e podem ser interpretados como não "atuais"):E agora não calculamos ou mostramos a propriedade, quux:
Ressalvas
Mas talvez saibamos que nossas propriedades não são caras. Podemos querer alterar a lógica para incluí-los também. E talvez desejemos excluir outro costume descritores de dados .
Então, precisamos personalizar ainda mais essa função. E, portanto, faz sentido que não possamos ter uma função interna que saiba magicamente exatamente o que queremos e a forneça. Essa é a funcionalidade que precisamos criar para nós mesmos.
Conclusão
Não existe uma função interna que faça isso, e você deve fazer o que é semanticamente mais apropriado para sua situação.
fonte
FunctionType
. Mas muito útil - obrigado!Um exemplo de metaprogramação Despejar objeto com magia :
Sem argumentos:
Com o Gnosis Utils :
Está um pouco desatualizado, mas ainda está funcionando.
fonte
Se você está usando isso para depuração e deseja apenas um despejo recursivo de tudo, a resposta aceita é insatisfatória porque exige que suas classes já tenham boas
__str__
implementações. Se não for esse o caso, isso funciona muito melhor:fonte
TypeError: vars() argument must have __dict__ attribute
Tente ppretty
Resultado:
fonte
fonte
Isso imprime todo o conteúdo do objeto recursivamente no formato indentado json ou yaml:
fonte
Votou a resposta que menciona apenas pprint. Para ser claro, se você deseja ver todos os valores em uma estrutura de dados complexa, faça algo como:
Onde my_var é sua variável de interesse. Quando usei,
pprint(vars(my_var))
não obtive nada e as outras respostas aqui não ajudaram ou o método pareceu desnecessariamente longo. A propósito, no meu caso particular, o código que eu estava inspecionando tinha um dicionário de dicionários.Vale ressaltar que, com algumas classes personalizadas, você pode acabar tendo um
<someobject.ExampleClass object at 0x7f739267f400>
tipo de saída inútil . Nesse caso, talvez você precise implementar um__str__
método ou tentar algumas das outras soluções. Ainda gostaria de encontrar algo simples que funcione em todos os cenários, sem bibliotecas de terceiros.fonte
Eu estava precisando imprimir as informações de DEBUG em alguns logs e não consegui usar o pprint, pois isso iria quebrá-lo. Em vez disso, fiz isso e consegui praticamente a mesma coisa.
fonte
Para despejar "myObject":
Eu tentei vars () e dir (); ambos falharam pelo que eu estava procurando. vars () não funcionou porque o objeto não tinha __dict__ (exceptions.TypeError: o argumento vars () deve ter o atributo __dict__). dir () não era o que eu estava procurando: é apenas uma lista de nomes de campos, não fornece os valores ou a estrutura do objeto.
Eu acho que json.dumps () funcionaria para a maioria dos objetos sem o padrão = json_util.default, mas eu tinha um campo datetime no objeto para que o serializador json padrão falhasse. Consulte Como superar "datetime.datetime não JSON serializable" em python?
fonte
Por que não algo simples:
fonte
for key,value in obj.__dict__.iteritems(): print key,value
?O pprint contém uma "impressora bonita" para produzir representações esteticamente agradáveis de suas estruturas de dados. O formatador produz representações de estruturas de dados que podem ser analisadas corretamente pelo intérprete e também são fáceis para o ser humano ler. A saída é mantida em uma única linha, se possível, e recuada quando dividida em várias linhas.
fonte
Apenas tente impressão .
Isso o ajudará não apenas com a impressão de variáveis de objetos, mas também com uma saída bonita, como esta:
fonte
Para todo mundo lutando com
vars()
não retornando todos os atributos.dir()
não retornando os valores dos atributos.O código a seguir imprime todos os atributos de
obj
com seus valores:fonte
Você pode tentar a barra de ferramentas Flask Debug.
https://pypi.python.org/pypi/Flask-DebugToolbar
fonte
Eu gosto de trabalhar com chaves ou valores internos de tipos de objetos python .
Para atributos, independentemente de serem métodos ou variáveis:
Para valores desses atributos:
fonte
Isso funciona, independentemente de como suas variáveis sejam definidas dentro de uma classe, dentro de __init__ ou fora.
fonte