O que você acha dessa nova sintaxe if-then [fechada]

11

Eu só estava pensando em algo que seria muito legal de ter nos meus controles if-elif-else.


if condition:
    stuff()
elif condition:
    otherstuff()
then:
    stuff_that_applies_to_both()
else:
    stuff_that_doesnt_aply_to_either()

Então, basicamente, um thenserá executado quando qualquer uma das condições for executada, EXCETO a condição else. Você acha que isso é útil? É semelhante ao try-except-else do python.

Eu acho que alguns de vocês estão sugerindo uma implementação muito preliminar. O thenbloco seria como o elsebloco de um try-exceptbloco em python. A verdadeira razão pela qual sugiro isso é para situações como essa.


m = {}
if condition == '1':
    m['condition'] = condition
elif condition2 == '3':
    m['condition2'] = condition2
elif condition3 == 'False':
    m['condition3'] = True
then:
    run_test_that_relies_on_one_of_the_conditions_being_true()

return m

O thenbloco tem o escopo definido para o primeiro, exatamente como o elseé. Portanto, o aninhamento funciona bem. E se você precisar executar um método antes das instruções if, isso realmente não tem nada a ver com este caso de uso.

Falmarri
fonte
quão aninhado isso pode ser?
aggietech
6
+1 por pensar fora da caixa, mas não votaria para implementá-la. Veja minha resposta por que abaixo.
Wonko the Sane 19/10/10
1
Então 'then' age como finallyem Java?
Alex Feinman
1
Eu acho thenum pouco confuso. Geralmente thenestá implícito que ocorre após um if. Quero dizer, você está dizendo, if condition, then stuff()mas prossegue dizendothen stuff that applies to both
Matt Olenik 19/10/10
2
+1 para um exercício de pensamento interessante, mas concordo com as respostas que estão sendo apresentadas em Bad Idea. Simplesmente não é intuitivo, e eu pude ver isso REALMENTE acionando alguns codificadores.
BlizzHippo 19/10/10

Respostas:

17

Eu acho que parece horrível. Se você deseja que o código seja executado após uma variedade de condições, (a) verifique novamente essas condições ou (b) defina uma variável para o status de sucesso indicado.

Josh K
fonte
2
Eu concordo - é muito difícil entender o que isso significa sem uma explicação como a que você deu.
tcrosley
Por que exigir uma explicação de como algo funciona demais para se esperar?
Falmarri 19/10/10
5
Porque torna o código mais difícil de ler.
Antsan
Não tenho certeza se isso é justo. Toda construção no código deve ser explicada uma vez.
mago
14

Geralmente, você já pode fazer isso com um switch / case e um switch / case fornece um controle mais preciso sobre o que você está propondo.

Também não lê corretamente logicamente. Se A mais se B, então C. Não implica a alguém que C será executado se A ou B avaliarem como verdadeiro.

Brian R. Bondy
fonte
2
Python não têm declarações de switch / case
Falmarri
2
Eu não acho que a pergunta tenha sido formulada diretamente para as respostas apenas do Python, mas se essa era a intenção, marque como Python também.
Brian R. Bondy
Bem, não está diretamente redigido para python. O exemplo estava em python. Mas se a sua resposta para o porquê disso não é necessário é "há instruções de troca", o python não as possui.
Falmarri 19/10/10
1
@Falmarri: É justo, então acho que a minha resposta seria que o Python seria melhor para suportar declarações de comutação clássicas.
Brian R. Bondy
o código da pergunta está em Python não significa que a pergunta seja sobre Python, porque também pode ser pseudocódigo. Se isso é apenas cerca de Python, então ele deve ser marcado como tal
phuclv
8

Interessante, mas me parece (reconhecidamente um pouco definido), um convite para problemas de legibilidade, lógica e sintaxe.

Edit: Seu if-elif é muito simples - e se houvesse 10 elifs? 20? Todas as condições precisariam ser verdadeiras? Quais são as chances disso?
Seu if-elif é muito simples - e se houvesse 10 elifs? 20? Isso não tornaria isso ilegível?

Além disso, pode ser facilmente alcançado pela metodologia estabelecida testada e comprovada:

if (thisCondition or thatCondition)
{
  if (thisCondition)
     stuff();
  else
     otherstuff();

    stuff_that_applies_to_both();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

O que acontece se "stuff_that_applies_to_both" precisar acontecer antes das etapas individuais? Seu código não lida com este caso:

if (thisCondition or thatCondition)
{
  stuff_that_applies_to_both();

  if (thisCondition)
     stuff();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Por fim, essa sintaxe permite maior flexibilidade com mais condições: if (thisCondition ou thatCondition ou outraCondition) {stuff_that_applies_to_all ();

  // Any combination of the three conditions using 
  // whichever logical syntax you'd like here
  if (thisCondition and anotherCondition)
     stuff();
  else if (thisCondition or thatCondition)
     stuff_number_2();
  else
     otherstuff();
}
else
{
    stuff_that_doesn't_aply_sic_to_either();
}

Eu tenho usado if / else, mas poderia ter usado tão facilmente uma instrução switch com um sinalizador:

Boolean conditionApplies = true;

switch (someConditionToCheck)
{
    case thisCondition:
      stuff();
      break;

    case thatCondition:
        otherStuff();
        break;

    default:
        stuff_that_doesnt_aply_sic_to_either();
        conditionApplies = false;
        break;
}

if (conditionApplies)
    stuff_that_applies_to_both();

Observe que, na verdade, eu não precisava do sinalizador conditionApplies - eu poderia ter adicionado a função "stuff_that_applies_to_both ()" a ambas as condições não padrão - apenas fiz isso para que pareça mais com a sintaxe definida acima, embora com o "then" ao invés do "outro".

Portanto, parece-me uma sintaxe muito especializada, onde uma sintaxe mais geral preenche a conta e muito mais.

+1 por pensar em um recurso possível (continue fazendo isso!), Mas eu não votaria para implementá-lo.


1
+1 para "experimentado e verdadeiro metodologia estabelecida" - se há uma solução razoável para um problema, geralmente é melhor usá-lo :)
Bedwyr

what if there were 10 elifs? 20? Would all conditions need to be true?Isso não é possível. apenas 1 elif pode ser verdadeiro porque para de avaliar mais.
Falmarri 19/10/10

Meu erro - eu li como "e" quando você quis dizer "ou". No entanto, mantenho minha resposta - atualizarei a partir do que você apontou.
Wonko the Sane 19/10/10

Você realmente acha que a sintaxe que você postou aqui é mais clara do que eu sugeri? Você não apenas verifica suas condições duas vezes, mas não aninhar é sempre melhor do que aninhar
Falmarri 19/10/10

1
Assim como o seu, a menos que o seu "então" se aplique verdadeiramente a todas as condições, as quais, à medida que você adiciona cada vez mais, tornam-se cada vez menos prováveis. E, pessoalmente, vindo de um background em C / C ++ / C #, acho que o aninhamento é um pouco menos confuso do que a sintaxe dividida (por exemplo, fazer algo aqui em cima no "se" ou talvez um "elsif" e depois pular e fazer algo mais no "então". Eu, pessoalmente, acho a sintaxe mais legível para ter todas as condições juntas. Pode não estar certo, mas é um conceito mais estabelecido no meu dia-a-dia.
Wonko the Sane

2

Hoje eu não me importaria de usar algo assim. Mas, para ter certeza, eu o usaria tantas vezes quanto repito até.

O código pareceria pelo menos melhor sem o aninhamento supérfluo. Embora eu prefira Else Ifa elif. Eu substituiria o Thencom Doe o final Elsepor Otherwise.


Bem falar com os criadores de python, não me =]
Falmarri

Oh, eu pensei que você estava criando um novo idioma. Eu estava apenas sugerindo que o nome muda para ser mais preciso, deixe o elif se você quiser, mas esse último item parece que deve ser diferente de um item regular.
Peter Turner

Bem, não é necessariamente para uma nova linguagem, mas também não é necessariamente para python. Apenas uma nova idéia para uma regra de sintaxe em geral. Isso pode ser aplicado a qualquer idioma com relativamente poucos efeitos colaterais.
Falmarri

0

Parece uma ideia legal. No entanto, o único problema que imagino é que você é mais propenso a erros. Como escrever um if / else if e chamar blah () então. Escreva um outro extra se isso não quiser blá, removendo blá e adicione-o aos seus ifs / elseifs. Então, quando você ou outro programador adicionar outra declaração, poderá esperar que blá seja chamado, mas não.

Ou você pode ter vários ifs, escrever um blá e esquecer todos os ifs, exceto um que exige isso, o que quebraria alguma coisa. Também há chances de que você precise seguir todos os itens, se você o colocar sob o bloco if. Possivelmente definindo um bool em else (NoUpdate = true) e basta escrever um if (! NoUpdate) {} diretamente sob o qual é mais claro e pode ser definido por um if

Só estou dizendo que parece mais propenso a erros, não que eu não goste da idéia. Eu não me importaria de vê-lo em um idioma, mas não consigo imaginar nenhuma situação em que eu o usaria se meu idioma o apoiar.


fonte
Possibly setting a bool in else (NoUpdate=true) and just write a if(!NoUpdate) {} directly under which is clearer and can be set by an ifIsso é EXATAMENTE o que isso deve impedir. Esse é o objetivo de uma declaração elif. O Elif também não é necessário, pode ser verificado com instruções if, mas fica complicado.
Falmarri 3/11
0

Acho sua sintaxe confusa, mas vejo algum valor no conceito. Conceitualmente, quando considero o problema, o que me vejo querendo é um "descuidado", que basicamente executaria coisas nos casos em que o último elsenão foi acionado . Olhando por esse ângulo, sugiro que se possa obter um resultado semelhante via:

  Faz
  {
    se (condição1)
      ... apenas para condição1
    senão se (condição2)
      ... material apenas para condition2
    outro
    {
      ... material para nenhuma das condições
      pausa;
    }
    ... coisas para ambas as condições
  } enquanto (0); // Ponto de continuação do intervalo

Outra opção pode, em alguns casos, ser:

  if ((condição1 e& (ação1,1)) ||
       (condição2 e& (ação2,1)) ||
       (action_for_neither, 0))
    action_for_either;

Um pouco desagradável, mas em alguns casos pode não haver uma boa maneira de expressar a sequência desejada de eventos além de duplicar o código ou usar goto(o que pode não ser tão ruim, exceto pelo desenho animado que alguém possa inserir aqui).

supercat
fonte