Pergunta

Em C # Eu poderia facilmente escrever o seguinte:

string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;

Existe uma maneira rápida de fazer a mesma coisa em Python ou estou preso com um 'if'?

Foi útil?

Solução

Em Python 2.5, há

A if C else B

que se comporta muito como:? Em C. No entanto, é desaprovada por duas razões: a legibilidade, e o fato de que há geralmente uma maneira mais simples de abordar o problema. Por exemplo, no seu caso:

stringValue = otherString or defaultString

Outras dicas

@ Dan

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

Este tipo de código é mais longo e mais expressivo, mas também mais legível

Bem, sim, é mais longo. Não tenho certeza sobre “mais expressivo” e “mais legível”. No mínimo, o seu pedido é discutível. Eu mesmo ir tão longe como dizer é absolutamente errada, por duas razões.

Em primeiro lugar, o seu código enfatiza a tomada de decisão (em vez extremamente). Onthe outro lado, o operador condicional enfatiza outra coisa, ou seja, o valor (resp. A atribuição do referido valor). E esta é exatamente o que o escritor deste código quer. A tomada de decisão é realmente bastante um subproduto do código. A parte importante aqui é a operação de atribuição. Suas peles de código Esta atribuição em um monte de ruído sintática:. A ramificação

Seu código é menos expressiva, pois muda a ênfase do papel importante.

Mesmo assim, o código seria provavelmente trunfo alguma arte ASCII obscura como ?:. Um inline-if seria preferível. Pessoalmente, eu não gosto da variante introduzida com Python 2.5, porque é para trás. Eu preferiria algo que lê no mesmo fluxo (direção) como o operador C ternária, mas usa palavras em vez de caracteres ASCII:

C = if cond then A else B

Este ganha mãos para baixo.

C e C #, infelizmente, não tem uma declaração tão expressivo. Mas (e este é o segundo argumento), o operador condicional ternário de linguagens C é muito tempo estabelecido que se tornou uma linguagem em si. O operador ternário é tanto parte da linguagem como a declaração if “convencional”. Porque é um idioma, qualquer um que conheça a linguagem imediatamente lê este direito código. Além disso, é uma maneira extremamente curto, conciso de expressar essa semântica. Na verdade, é o mais curto maneiras imagináveis. É extremamente expressiva, pois não obscurece a essência com o ruído desnecessário.

Finalmente, Jeff Atwood tem escrito a conclusão perfeita para isto: O melhor código nenhum código em tudo .

Nunca é uma coisa ruim para escrever legível código, expressivo.

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

Este tipo de código é mais longo e mais expressivo, mas também mais legível e menos propensos a se tropeçar ou mis-editado pela estrada. Não tenha medo de escrever de forma expressiva -. Código legível deve ser uma meta, não um subproduto

Existem algumas duplicatas desta questão, por exemplo.

Em essência, em um ambiente geral de pré-2.5 código deve usar este:

 (condExp and [thenExp] or [elseExp])[0]

(dado condExp, thenExp e elseExp são expressões arbitrárias), uma vez que evita resultados errado se avalia thenExp para booleano Falso, mantendo a avaliação de curto-circuito.

A propósito, j0rd4n, você não ( por favor não!) Escrever código como este em C #. Além do fato de que o IsDefaultOrNull é realmente chamado IsNullOrEmpty, este é o inchaço de código puro. C # oferece ao operador coalesce para situações como estas:

string stringValue = otherString ?? defaultString;

É verdade que isso só funciona se otherString é null (em vez de vazio), mas se isso pode ser assegurado de antemão (e muitas vezes isso pode) torna o código muito mais legível.

Eu também descobri que apenas usando o operador "ou" faz muito bem. Por exemplo:

finalString = get_override() or defaultString

Se get_override () retorna "" ou nenhum, ele vai sempre usar DefaultString .

capítulo 4 do diveintopython.net tem a resposta. É o chamado e-ou truque em Python.

Você pode tirar proveito do fato de que as expressões lógicas retornar o seu valor, e não apenas status de verdadeiro ou falso. Por exemplo, você sempre pode usar:

result = question and firstanswer or secondanswer

Com a ressalva de que ele não funciona como o operador ternário se firstanswer é falsa. Isto é porque a pergunta é avaliado primeiro, assumindo que é verdade firstanswer é devolvido a menos firstanswer é falsa, então esse uso não agir como o operador ternário. Se você conhece os valores, no entanto, normalmente não há problema. Um exemplo seria:

result = choice == 7 and "Seven" or "Another Choice"

Se você usou rubi, você poderia escrever

stringValue = otherString.blank? ? defaultString : otherString;

construído no meio de métodos blank? nulo ou vazio.
Venha para o lado escuro ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top