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):

  1. 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?
  2. 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?
  3. Existe-t-il un moyen de faire en sorte que pprint saute de ligne entre les propriétés?
1
Yarin 17 nov. 2011 à 18:22

3 réponses

Meilleure réponse

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().

5
dcrosta 17 nov. 2011 à 14:30

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
}
2
Chris Johnson 24 déc. 2019 à 03:36

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.

1
Richard Hansen 21 avril 2016 à 23:45
8168654