Como posso intimamente alcançar: a partir de C ++ / C #, em Python?
-
02-07-2019 - |
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'?
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.
- Does Python ter um operador condicional ternário?
- Qual é a melhor maneira de substituir o operador ternário em Python?
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 ...