Qual é a maneira mais idiomática de fazer o seguinte?
def xstr(s):
if s is None:
return ''
else:
return s
s = xstr(a) + xstr(b)
atualização: estou incorporando a sugestão de Tryptich para usar str (s), o que faz essa rotina funcionar para outros tipos além de strings. Estou muito impressionado com a sugestão lambda de Vinay Sajip, mas quero manter meu código relativamente simples.
def xstr(s):
if s is None:
return ''
else:
return str(s)
s
veio de uma pesquisa de ditado onde a chave não foi encontrada, usedict.get(key, '')
Respostas:
Se você realmente deseja que sua função se comporte como a
str()
incorporada, mas retorne uma sequência vazia quando o argumento for Nenhum, faça o seguinte:fonte
xstr = lambda s: '' if s is None else str(s)
if not s:
vez deif s is None
not False == True
masFalse is None == False
.s
sempre um tipo str / unicode ouNone
. Sim,False
é um valor, mas eu prefiro dessa forma que salva o meu teclado e os olhos;)fonte
return s is not None and s or ''
... and .. or ..
falha e por que se-mais é preferido. Existem dois erros sutiss is not None and s or ''
.return '' if not s else str(s)
Provavelmente o menor seria
str(s or '')
Porque None é False, e "x ou y" retorna y se x for falso. Consulte Operadores booleanos para obter uma explicação detalhada. É curto, mas não muito explícito.
fonte
or
este caminho #s
for 0, False, ou qualquer valor Falsas''
iffs is None
. Todas as outras entradas devem retornars
(oustr(s)
na solicitação revisada).s
éNone
, o resultadoxstr()
deve ser uma cadeia vazia, masstr(None)
dá a corda"None"
, que é o que é devolvido (uma vez que a corda"None"
não é um valor Falsas.Se você souber que o valor sempre será uma sequência ou Nenhum:
fonte
[]
,{}
etc. dê o mesmo resultado queNone
, o que não é desejado.xstr(False)
, em particular, deve ser em"False"
vez de""
. Abusar lambdas é um mau exemplo, usedef xstr(s): return s or ""
ir e você deseja manter tudo em uma linha.return s or ''
funcionará bem para o seu problema declarado!fonte
s = False
ous = 0
seria mais provável ser um caso extremo em seu uso, e pode ser facilmente atenuado por escrevê-lo comoreturn str(s or '')
fonte
''
para0
,[]
,{}
,False
e falso-like valores, que não é o que o cartaz pediu.def xstr(s): return str(s) or ""
Maneira funcional (one-liner)
fonte
Uma linha simples para fazer isso com base em algumas das outras respostas:
ou mesmo apenas:
fonte
(lambda v: v or '')
?False
lista vazia também será alterada para ''.0
, etc.fonte
get
.Eu uso a função max:
Funciona como um encanto;) Basta colocar sua string no primeiro parâmetro da função.
fonte
Variação acima, se você precisar ser compatível com o Python 2.4
fonte
Se se trata de formatar seqüências de caracteres, você pode fazer o seguinte:
fonte
fonte
Sempre podemos evitar a conversão de tipos nos cenários explicados abaixo.
No exemplo acima, no caso de o valor da variável do cliente ser None, ele também é convertido enquanto é atribuído a 'name'. A comparação na cláusula 'if' sempre falhará.
O exemplo acima funcionará corretamente. Tais cenários são muito comuns quando valores estão sendo buscados a partir de URL, JSON ou XML ou mesmo valores precisam de conversão de tipo adicional para qualquer manipulação.
fonte
Use a avaliação de curto-circuito:
Como + não é uma operação muito boa em strings, use melhor as strings de formato:
fonte
+
é um operador perfeitamente bom para duas strings. É quando você tenta usá-lo para juntar-se a dezenas que tem problemas. Para dois, provavelmente será mais rápido que outras opções; de qualquer maneira, está no barulho.or
) parece um pouco exagerado para mim ... não tenho casos de outros valores falsamente - str ou None. Que não seja o comentário sobre o+
operador, que pode depender de cenário específico e pode precisar de benchmarking, esta resposta não não merecem um -1Use a string F se você estiver usando o python v3.7
fonte
'None'
ses
estiverNone
.