É cólon em blocos de python tecnicamente necessários?

14

Esta é realmente apenas uma questão teórica de um novato python que quer entender mais.

Eu continuo esquecendo os dois pontos após as instruções iniciais do bloco em python. É isso que eu quero dizer:

  • for <variable> in <sequence>:
  • if <blah blah>:

Meu pensamento é que uma razão pela qual eu continuo esquecendo é que eles são de fato implícitos: cólon ou não, a afirmação termina com essa linha.

Minha pergunta - que eu peço para aprender como funciona a sintaxe python - é se o cólon é realmente desnecessário? Se eu fosse mudar a sintaxe do python para que os dois pontos não fossem mais necessários, alguma coisa iria quebrar? Isso tornaria algumas declarações ambíguas ou impossíveis?

    
por Tomáš Zato 27.01.2017 / 12:30
fonte

4 respostas

8

Sim, o cólon é necessário para desambiguar certas construções. Considere, por exemplo, if x - y < z: pass . Sem o cólon, não podemos decidir como analisar isso sem saber o contexto do que x, yez são. if x: -y < z... é válido se x for booleano, if x - y < z: é válido de outra forma.

Como é uma boa idéia para um langauge de programação não requerer que você execute um aplicativo até o ponto que você está compilando para poder analisá-lo, o cólon é muito necessário. Você poderia desistir, mas precisaria de outras maneiras de se desambiguar.

    
por 27.01.2017 / 12:58
fonte
13

O cólon não é realmente necessário gramaticalmente, se o Python tiver sido projetado em um mundo diferente, é bastante concebível que o designer de linguagem não decida exigir o cólon. E, de fato, idiomas como o Cobra fazem isso.

A principal razão pela qual o cólon é necessário em python é a legibilidade humana. Para citar Python FAQ :

Why are colons required for the if/while/def/class statements?

The colon is required primarily to enhance readability (one of the results of the experimental ABC language). Consider this:

if a == b
    print(a)

versus

if a == b:
    print(a)

Notice how the second one is slightly easier to read. Notice further how a colon sets off the example in this FAQ answer; it’s a standard usage in English.

Another minor reason is that the colon makes it easier for editors with syntax highlighting; they can look for colons to decide when indentation needs to be increased instead of having to do a more elaborate parsing of the program text.

Como também mencionado no FAQ, o cólon também facilita o processamento do código python sem analisar completamente o idioma. Qualquer processador de texto que tenha um analisador completo, incluindo o compilador python, pode fazer sem os dois pontos se não fosse necessário ou se fosse opcional quando não ambíguo.

    
por 27.01.2017 / 14:31
fonte
9

Não é necessário para o computador, mas para humanos.

Guido van Rossum (criador do Python) teve um blog de história em Python por um tempo. O cólon foi introduzido em ABC , a fonte de muitos dos recursos do Python.

Em esta postagem de blog sobre "Karin Dewar, recuo e o cólon ", Guido escreve:

And here I will paraphrase, at Lambert's request.

In 1978, in a design session in a mansion in Jabłonna (Poland), Robert Dewar, Peter King, Jack Schwartz and Lambert were comparing various alternative proposed syntaxes for B, by comparing (buggy) bubble sort implementations written down in each alternative. Since they couldn't agree, Robert Dewar's wife was called from her room and asked for her opinion, like a modern-day Paris asked to compare the beauty of Hera, Athena, and Aphrodite. But after the first version was explained to her, she remarked: "You mean, in the line where it says: 'FOR i ... ', that it has to be done for the lines that follow; not just for that line?!" And here the scientists realized that the misunderstanding would have been avoided if there had been a colon at the end of that line.

( B aqui é uma série de protótipos de idiomas B0, B1, ... que levaram à ABC. Não é a linguagem B que é a predecessora de C).

Eu também lembro de Guido apontando nos anos 90 que era para o benefício de editores , que pode inserir automaticamente um recuo após uma linha que termina com dois pontos. Mas ainda não encontrei uma fonte para isso.

    
por 27.01.2017 / 14:26
fonte
2

A sintaxe Cobra Programming Language é strongmente inspirada no Python, e elimina os dois pontos, então parece que não é estritamente necessário. No entanto, não é suficiente que apenas remova os dois pontos; há outras alterações na sintaxe necessária. Veja, por exemplo, este pedaço de código de um dos meus toy projects :

kons  = lambda hd, tl: lambda x: hd if x else tl
virst = lambda l: l(True )
rrest = lambda l: l(False)

Sem os dois pontos para separar o corpo da lista de parâmetros, eu teria que usar o recuo:

kons  = lambda hd, tl
    lambda x
        hd if x else tl

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

Acredito que versões anteriores do Cobra tornaram o cólon opcional, você pode usar recuo, dois pontos ou ambos. Semelhante a como funciona em Ruby, onde existem palavras-chave para separar as diferentes partes das expressões de controle, mas você também pode usar separadores de expressão (ponto-e-vírgula ou nova linha):

# idiomatic
while true do puts "I am awesome" end
#          ↑↑

# non-idiomatic, but legal
while true; puts "I am awesome" end
#         ↑

# non-idiomatic, but legal
while true
puts "I am awesome" end

# idiomatic
while true
  puts "I am awesome"
end

Nas versões atuais do Cobra, você pode usar uma vírgula:

if x
    y

pode ser escrito como

if x, y

Você precisa de algumas maneiras de separar as diferentes partes das expressões ou definições de controle. Em Python, isso é o cólon. Se você remover os dois pontos, precisará substituí-lo por outra coisa, por exemplo, forçado indentação. Somente remover o cólon não funcionará.

A única maneira de ter absoluta certeza é formalizar a sintaxe com e sem dois pontos e provar sua não-ambigüidade.

Note, no entanto, que um dos aforismos do Zen do Python é "Explicito é melhor do que Implícito ", então o delineamento explícito de blocos com dois pontos parece se encaixar na filosofia geral do Python. As Design e História O FAQ também menciona que esta decisão é baseada em evidências empíricas do antecessor do Python, ABC.

    
por 27.01.2017 / 12:52
fonte