Qual é a maneira correta de formatar um ditado de várias linhas no Python?

184

No Python, quero escrever um ditado de várias linhas no meu código. Existem algumas maneiras de formatá-lo. Aqui estão alguns que eu poderia pensar:

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

Sei que qualquer uma das opções acima é sintaticamente correta, mas presumo que exista um estilo de recuo e quebra de linha preferido para os dicionários do Python. O que é isso?

Nota: Este não é um problema de sintaxe. Todos os itens acima são (até onde eu sei) declarações Python válidas e são equivalentes entre si.

Ryan C. Thompson
fonte
12
Para 1 e 2: Sem espaços diretamente dentro das chaves, consulte PEP 8.
Sven Marnach
3
Quero dizer que, no módulo python pprint, ele usa seu primeiro exemplo, sem espaços diretamente dentro do aparelho.
precisa saber é o seguinte

Respostas:

239

Eu uso # 3. O mesmo para listas longas, tuplas, etc. Não requer a adição de espaços extras além dos recuos. Como sempre, seja consistente.

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

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

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

Da mesma forma, aqui está a minha maneira preferida de incluir cadeias grandes sem introduzir espaços em branco (como você usaria se usasse cadeias de linhas múltiplas com aspas triplas):

data = (
    "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABG"
    "l0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEN"
    "xBRpFYmctaKCfwrBSCrRLuL3iEW6+EEUG8XvIVjYWNgJdhFjIX"
    "rz6pKtPB5e5rmq7tmxk+hqO34e1or0yXTGrj9sXGs1Ib73efh1"
    "AAAABJRU5ErkJggg=="
)
FogleBird
fonte
Você poderia incluir alguma referência? Estou tendo problemas para encontrar uma fonte autorizada sobre isso. (Eu concordo com você).
precisa
82
Hmm, eu encontrei o seguinte: stackoverflow.com/questions/6388187/…
FogleBird
6
Não diga a ele, mas o usuário não tem nenhuma idéia o que ele está falando; P
Trufa
3
lol, mais seriamente, também não consegui encontrar uma referência "autoritária". Eu vou deixar você saber se eu fizer! Talvez alguém deva entrar em contato com Guido.
FogleBird 17/06
2
Isso corresponde ao PEP 8: python.org/dev/peps/pep-0008/#indentation . Existem alguns exemplos de lista na parte inferior da seção sobre recuo.
AMS
31

Antes de tudo, como Steven Rumbalski disse: "O PEP8 não trata dessa questão", por isso é uma questão de preferência pessoal.

Eu usaria um formato semelhante, mas não idêntico, ao seu formato 3. Aqui está o meu e por quê.

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()
RayLuo
fonte
eu gosto do comentário na linha. meu primeiro professor de programação (eu já vinha programando há anos) insistia em comentários inline, mas nunca explicava efetivamente o porquê. Agora você explicou uma prática que eu uso há cerca de 20 anos.
Joshua K
Aha, obrigada. Temos idade, experiência e "quilometragem" similares em termos de programação. Então, se você já iniciou a prática de comentários em linha há 20 anos (o que é impressionante!), Por que você ainda precisava da explicação do professor sobre isso há provavelmente 10 anos atrás, quando estava na sua universidade? Apenas curioso. :-)
RayLuo
muito boa pergunta :) O ATARI BASIC e o GWbasic praticamente o forçaram, sendo compiladores baseados em linhas de fluxo de cima para baixo. é algo que adotei ao ler o BASIC de Peter Norton (e depois o código ASM) em revistas de papel. aprendi o Turbo Pascal no meio, mas já tinha aprendido com os exemplos das revistas em papel e de acordo com as limitações do BASIC.
Joshua K
O PEP8 o aborda um pouco, pois recomenda não adicionar um espaço imediatamente após uma chave de abertura, para que as opções 1 e 2 no OP estejam fora.
Daniel Serodio
9

Como suas chaves são strings e como estamos falando de legibilidade, eu prefiro:

mydict = dict(
    key1 = 1,
    key2 = 2,
    key3 = 3,
)
dugres
fonte
6
Prefira não usar espaços ao definir kwargs. c = function(a=1, b=2)é mais "pitônico".
21814 Steve K
1

Geralmente, se você tem grandes objetos python, é muito difícil formatá-los. Pessoalmente, prefiro usar algumas ferramentas para isso.

Aqui está o python-beautifier - www.cleancss.com/python-beautify que transforma instantaneamente seus dados em um estilo personalizável.

Máx.
fonte
0
dict(rank = int(lst[0]),
                grade = str(lst[1]),
                channel=str(lst[2])),
                videos = float(lst[3].replace(",", " ")),
                subscribers = float(lst[4].replace(",", "")),
                views = float(lst[5].replace(",", "")))
gaurav raj
fonte
Isso não responde à pergunta
bagerard
-1

Da minha experiência com tutoriais, e outras coisas, o número 2 sempre parece preferido, mas é uma escolha de preferência pessoal mais do que qualquer outra coisa.

Jake
fonte
-6

Geralmente, você não incluiria a vírgula após a entrada final, mas o Python corrigirá isso para você.

Joe
fonte
34
Não! Sempre inclua a vírgula final, portanto, se você adicionar um novo último elemento, não precisará alterar a linha antes dele. Essa é uma das grandes coisas do Python: praticidade sobre pureza.
Ned Batchelder
2
Além disso, esta resposta não aborda a pergunta.
RKD314