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.


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.


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.


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.


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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.