O cólon em blocos python é tecnicamente necessário?

19

Esta é realmente apenas uma pergunta teórica de um novato em 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 das razões pelas quais continuo esquecendo é que elas são de fato implícitas: dois pontos ou não, a afirmação termina com essa linha.

Minha pergunta - que pergunto para saber como funciona a sintaxe python - é se os dois pontos são realmente desnecessários? Se eu mudasse a sintaxe do python para que o cólon não fosse mais necessário, algo quebraria? Isso tornaria algumas afirmações ambíguas ou impossíveis?

Tomáš Zato - Restabelecer Monica
fonte
4
Eu acho que você não entende a pergunta, que é se os dois pontos são necessários para que a sintaxe funcione. Além disso, não importa qual seja sua resposta, ela também deve conter uma explicação.
Tomáš Zato - Restabelece Monica
Provavelmente, você pode reformular partes da pergunta, para que eu possa me beneficiar da sua visão sobre esse assunto, talvez um exemplo? Você seria o melhor juiz, acho que não tenho noção da sua intenção de perguntar. Você quer dizer isso no nível do analisador de intérpretes / compiladores? Muito obrigado.
sur bhan
Não sei como dizer melhor. A minha pergunta é basicamente, se você pudesse mudar tudo sintaxe python para que ele não precisa mais de dois pontos após if, else, whilee assim por diante. Se você fez isso, o python ainda seria uma linguagem que pode ser usada sem ambiguidade?
Tomáš Zato - Restabelece Monica
Entendi! É uma pergunta sobre as decisões de design de sintaxe do python . Desculpe, entendi errado. Obrigado por explicar.
precisa saber é
Especulando. É como se as quebras de linha fossem mais difíceis de detectar pelos intérpretes / analisadores na prática ou se houvesse legibilidade. No LUA, você pode escrever if .. then .. endem uma única linha. Portanto, aqui em python thené substituído por duas coisas a :e uma nova linha necessária. Um deles parece redundante.
precisa saber é

Respostas:

9

Sim, o cólon é necessário para desambiguar certas construções. Considere, por exemplo if x - y < z: pass,. Sem os dois pontos, não podemos decidir como analisar isso sem conhecer o contexto do que x, ye z. if x: -y < z...é válido se x for booleano; if x - y < z:caso contrário , é válido.

Como é uma idéia muito boa para um idioma de programação não exigir que você execute um aplicativo até o ponto em que está compilando para poder analisá-lo, os dois pontos são muito necessários. Você pode descartá-lo, mas precisará de outras maneiras de desambiguar.

Phoshi
fonte
1
Espere, você pode ter uma declaração após os dois pontos na mesma linha? Eu tinha certeza que não é permitido.
Tomáš Zato - Restabelecer Monica
1
É permitido, mas somente após uma quebra de linha.
Phoshi
Ainda um pouco confuso. Isso é permitido: if condition: print("Condition passed")\npermitido? O \nsimboliza nova linha após a declaração de impressão.
Tomáš Zato - Restabelecer Monica
Claro, tente.
RemcoGerlich 27/01
1
@ TomasZato: sim, você pode ter qualquer declaração após o cólon. Ele termina imediatamente o bloco, por isso é útil principalmente quando o bloco é pequeno.
Lie Ryan
14

O cólon não é realmente necessário gramaticalmente, se o Python tivesse sido projetado em um mundo diferente, é bastante concebível que o designer da 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 as Perguntas frequentes do Python :

Por que dois pontos são necessários para as instruções if / while / def / class?

O cólon é necessário principalmente para melhorar a legibilidade (um dos resultados da linguagem ABC experimental). Considere isto:

if a == b
    print(a)

versus

if a == b:
    print(a)

Observe como o segundo é um pouco mais fácil de ler. Observe ainda como dois pontos destacam o exemplo nesta resposta da FAQ; é um uso padrão em inglês.

Outro motivo menor é que os dois pontos facilitam para editores com destaque de sintaxe; eles podem procurar dois pontos para decidir quando o recuo precisa ser aumentado em vez de precisar fazer uma análise mais elaborada do texto do programa.

Como também mencionado nas Perguntas frequentes, os dois pontos também facilitam o processamento do código python sem analisar completamente o idioma. Qualquer processador de texto que possua um analisador completo, incluindo o compilador python, pode ficar sem dois pontos se não for necessário ou se for opcional quando não ambíguo.

Lie Ryan
fonte
3
“Observe como o segundo é um pouco mais fácil de ler.” Acho o primeiro mais fácil de ler. Menos barulho.
user76284 2/07
10

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

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

Em este post sobre "Karin Dewar, recuo e do cólon" , Guido escreve:

E aqui vou parafrasear, a pedido de Lambert.

Em 1978, em uma sessão de design em uma mansão em Jabłonna (Polônia), Robert Dewar, Peter King, Jack Schwartz e Lambert estavam comparando várias sintaxes alternativas propostas para B, comparando implementações de tipo de bolha (buggy) escritas em cada alternativa. Como eles não concordavam, a esposa de Robert Dewar foi chamada do quarto e pediu sua opinião, como uma Paris moderna pediu para comparar a beleza de Hera, Athena e Afrodite. Mas depois que a primeira versão lhe foi explicada, ela comentou: "Você quer dizer, na linha em que diz: 'FOR i ...', que isso deve ser feito nas linhas que se seguem; não apenas nessa linha? ! " E aqui os cientistas perceberam que o mal-entendido teria sido evitado se houvesse dois pontos no final dessa linha.

( B aqui está uma série de linguagens de protótipo B0, B1, ... que levaram ao ABC. Não é a linguagem B que é a antecessora de C).

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

RemcoGerlich
fonte
4

A sintaxe da linguagem de programação Cobra é fortemente inspirada na linguagem Python e acaba com os dois pontos, portanto parece que não é estritamente necessário. No entanto, não basta remover o cólon, existem outras alterações na sintaxe necessária. Veja, por exemplo, este código de um dos meus projetos de brinquedos :

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 precisaria 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 as versões anteriores do Cobra tornavam o cólon opcional, você poderia usar o recuo, o cólon ou ambos. Semelhante à maneira como funciona no 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 alguma maneira de separar as diferentes partes das expressões ou definições de controle. Em Python, esse é o cólon. Se você remover o cólon, precisará substituí-lo por outra coisa, por exemplo, recuo forçado . Apenas remover o cólon não funcionará.

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

Observe, no entanto, que um dos aforismos do Zen do Python é "Explícito é melhor que implícito"; portanto, o delineamento explícito de blocos com dois pontos parece se encaixar na filosofia geral do Python. As Perguntas frequentes sobre design e história também mencionam que esta decisão se baseia em evidências empíricas do antecessor do Python, ABC.

Jörg W Mittag
fonte
3
Bem, com essa filosofia descrita no último parágrafo, você pode precisar de dois pontos no final de cada linha. Explícito vs implícito só faz sentido se o explícito realmente adicionar informações (por exemplo, a variante implícita é ambígua). Qual foi o ponto da minha pergunta.
Tomáš Zato - Restabelece Monica