web-dev-qa-db-fra.com

Quelle est la bonne façon de formater un dict multiligne en Python?

En Python, je veux écrire un dict multiligne dans mon code. Il y a deux façons de le formater. Voici quelques exemples auxquels je pourrais penser:

  1. mydict = { "key1": 1,
               "key2": 2,
               "key3": 3, }
    
  2. mydict = { "key1": 1,
               "key2": 2,
               "key3": 3,
             }
    
  3. mydict = {
        "key1": 1,
        "key2": 2,
        "key3": 3,
    }
    

Je sais que tout ce qui précède est correct du point de vue de la syntaxe, mais je suppose qu’il existe un style d’indentation et de saut de ligne préféré pour Python dicts. Qu'Est-ce que c'est?

Remarque: Ce n'est pas un problème de syntaxe. Autant que je sache, tous les énoncés ci-dessus sont des instructions Python valides et sont équivalents.

160
Ryan Thompson

J'utilise # 3. Même chose pour les longues listes, les tuples, etc. Il n'est pas nécessaire d'ajouter d'espaces supplémentaires au-delà des indentations. Comme toujours, soyez cohérent.

mydict = {
    "key1": 1,
    "key2": 2,
    "key3": 3,
}

mylist = [
    (1, 'hello'),
    (2, 'world'),
]

nested = {
    a: [
        (1, 'a'),
        (2, 'b'),
    ],
    b: [
        (3, 'c'),
        (4, 'd'),
    ],
}

De même, voici ma méthode préférée pour inclure de grandes chaînes sans introduire d'espaces (comme si vous utilisiez des chaînes multilignes à trois guillemets):

data = (
    "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABG"
    "l0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEN"
    "xBRpFYmctaKCfwrBSCrRLuL3iEW6+EEUG8XvIVjYWNgJdhFjIX"
    "rz6pKtPB5e5rmq7tmxk+hqO34e1or0yXTGrj9sXGs1Ib73efh1"
    "AAAABJRU5ErkJggg=="
)
210
FogleBird

Tout d’abord, comme Steven Rumbalski l’a dit, "PEP8 ne répond pas à cette question", il s’agit donc d’une question de préférence personnelle.

Je voudrais utiliser un format similaire mais pas identique à votre format 3. Voici le mien, et pourquoi.

my_dictionary = { # Don't think dict(...) notation has more readability
    "key1": 1, # Indent by one press of TAB (i.e. 4 spaces)
    "key2": 2, # Same indentation scale as above
    "key3": 3, # Keep this final comma, so that future addition won't show up as 2-lines change in code diff
    } # My favorite: SAME indentation AS ABOVE, to emphasize this bracket is still part of the above code block!
the_next_line_of_code() # Otherwise the previous line would look like the begin of this part of code

bad_example = {
               "foo": "bar", # Don't do this. Unnecessary indentation wastes screen space
               "hello": "world" # Don't do this. Omitting the comma is not good.
} # You see? This line visually "joins" the next line when in a glance
the_next_line_of_code()

btw_this_is_a_function_with_long_name_or_with_lots_of_parameters(
    foo='hello world',  # So I put one parameter per line
    bar=123,  # And yeah, this extra comma here is harmless too;
              # I bet not many people knew/tried this.
              # Oh did I just show you how to write
              # multiple-line inline comment here?
              # Basically, same indentation forms a natural paragraph.
    ) # Indentation here. Same idea as the long dict case.
the_next_line_of_code()

# By the way, now you see how I prefer inline comment to document the very line.
# I think this inline style is more compact.
# Otherwise you will need extra blank line to split the comment and its code from others.

some_normal_code()

# hi this function is blah blah
some_code_need_extra_explanation()

some_normal_code()
24
RayLuo

Puisque vos clés sont des chaînes et que nous parlons de lisibilité, je préfère:

mydict = dict(
    key1 = 1,
    key2 = 2,
    key3 = 3,
)
9
dugres

Généralement, si vous avez de gros objets python, il est assez difficile de les formater. Personnellement, je préfère utiliser des outils pour cela.

Voici python-beautifier - www.cleancss.com/python-beautify qui transforme instantanément vos données en style personnalisable.

1
Max