J'utilise Utilisateur de l'environnement Google App Engine et j'ai simplement essayé ce qui suit:
pprint(user)
print vars(user)
Les resultats:
impression (utilisateur)
users.User(email='test@example.com',_user_id='18580000000000')
imprimer des variables (utilisateur)
{'_User__federated_identity': None, '_User__auth_domain': 'gmail.com',
'_User__email': 'test@example.com', '_User__user_id': '1858000000000',
'_User__federated_provider': None}
Plusieurs problèmes ici (désolé pour le multipart):
- Comment se fait-il que je ne vois pas toutes les variables de mon objet. Il ne montre pas
auth_domain
, qui a une valeur? - Existe-t-il un moyen de lui faire lister les propriétés qui sont = Aucune? Aucune n'est une valeur légitime, pourquoi traite-t-elle ces propriétés comme si elles n'existaient pas?
- Existe-t-il un moyen de faire en sorte que pprint saute de ligne entre les propriétés?
3 réponses
pprint
imprime le repr
de l'instance, tandis que vars
renvoie simplement le __dict__
de l'instance, dont le repr est ensuite imprimé. Voici un exemple:
>>> class Foo(object):
... def __init__(self, a, b):
... self.a = a
... self.b = b
... def __repr__(self):
... return 'Foo(a=%s)' % self.a
...
>>> f = Foo(a=1, b=2)
>>> vars(f)
{'a': 1, 'b': 2}
>>> pprint.pprint(f)
Foo(a=1)
>>> vars(f) is f.__dict__
True
Vous voyez que la méthode spéciale __repr__
ici (appelée par pprint()
, l'instruction print
, repr()
et autres) inclut explicitement uniquement le membre a
, tandis que l'instance __dict__
contient à la fois a
et b
, et est reflétée par le dictionnaire renvoyé par vars()
.
Il existe plusieurs façons d'obtenir différents sauts de ligne dans un objet print-dump de ce type.
Exemples de données:
d = dict(a=1, b=2, c=dict(d=3, e=[4, 5, 6], f=dict(g=7)), h=[8,9,10])
Impression standard sans espacement convivial:
>>> print d
{'a': 1, 'h': [8, 9, 10], 'c': {'e': [4, 5, 6], 'd': 3, 'f': {'g': 7}}, 'b': 2}
Deux solutions possibles:
(1) Utiliser pprint
avec width=1
vous donne un nœud feuille par ligne, mais éventuellement> 1 clés par ligne:
>>> import pprint
>>> pprint.pprint(d, width=1)
{'a': 1,
'b': 2,
'c': {'d': 3,
'e': [4,
5,
6],
'f': {'g': 7}},
'h': [8,
9,
10]}
(2) L'utilisation de json.dumps
vous donne au maximum une clé par ligne, mais certaines lignes avec juste une parenthèse fermante:
>>> import json
>>> print json.dumps(d, indent=4)
{
"a": 1,
"h": [
8,
9,
10
],
"c": {
"e": [
4,
5,
6
],
"d": 3,
"f": {
"g": 7
}
},
"b": 2
}
En référence à la question 3, "Existe-t-il un moyen de faire en sorte que pprint saute de ligne entre les propriétés?":
Les Docs Python font cette description:
La représentation formatée conserve les objets sur une seule ligne si elle le peut et les divise en plusieurs lignes s'ils ne tiennent pas dans la largeur autorisée.
La propriété "width" (passable in init) est l'endroit où vous spécifiez ce qui est autorisé. J'ai mis le mien à width = 1, et cela semble faire l'affaire.
Par exemple:
pretty = pprint.PrettyPrinter(indent=2)
Résulte en...
{ 'acbdf': { 'abdf': { 'c': { }}, 'cbdf': { 'bdf': { 'c': { }}, 'cbd': { }}},
'cef': { 'abd': { }}}
Tandis que
pretty = pprint.PrettyPrinter(indent=2,width=1)
Résulte en...
{ 'acbdf': { 'abdf': { 'c': { }},
'cbdf': { 'bdf': { 'c': { }},
'cbd': { }}},
'cef': { 'abd': { }}}
J'espère que cela pourra aider.
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.