¿Cuál es la forma más idiomática de hacer lo siguiente?
def xstr(s):
if s is None:
return ''
else:
return s
s = xstr(a) + xstr(b)
actualización: estoy incorporando la sugerencia de Tryptich de usar str (s), lo que hace que esta rutina funcione para otros tipos además de las cadenas. Estoy terriblemente impresionado por la sugerencia lambda de Vinay Sajip, pero quiero mantener mi código relativamente simple.
def xstr(s):
if s is None:
return ''
else:
return str(s)
s
provino de una búsqueda de dict donde no se encontró la clave, usedict.get(key, '')
Respuestas:
Si realmente desea que su función se comporte como la
str()
integrada, pero devuelva una cadena vacía cuando el argumento es Ninguno, haga esto:fuente
xstr = lambda s: '' if s is None else str(s)
if not s:
lugar deif s is None
not False == True
peroFalse is None == False
.s
siempre un tipo in / unicode o strNone
. Sí,False
es un valor, pero prefiero esta forma que salva mi teclado y mis ojos;)fuente
return s is not None and s or ''
... and .. or ..
falla y por qué se prefiere if-else. Hay dos errores sutiles ens is not None and s or ''
.return '' if not s else str(s)
Probablemente lo más corto sería
str(s or '')
Porque Ninguno es falso, y "x o y" devuelve y si x es falso. Ver operadores booleanos para una explicación detallada. Es breve, pero no muy explícito.
fuente
or
esta maneras
es 0, Falso o cualquier valor''
iffs is None
. Todas las demás entradas deben regresars
(ostr(s)
en la solicitud revisada).s
es asíNone
, el resultadoxstr()
debería ser una cadena vacía, perostr(None)
da la cadena"None"
, que es lo que se devuelve (ya que la cadena"None"
no es un valor falso.Si sabe que el valor siempre será una cadena o Ninguno:
fuente
[]
,{}
etc. den el mismo resultado queNone
, lo que no se desea.xstr(False)
, en particular, debe ser en"False"
lugar de""
. Abusar de lambdas es un mal ejemplo, usedef xstr(s): return s or ""
si desea mantenerlo todo en una línea.return s or ''
¡funcionará bien para su problema declarado!fuente
s = False
os = 0
probablemente sería un caso marginal en su uso y podría mitigarse fácilmente escribiéndolo comoreturn str(s or '')
fuente
''
para0
,[]
,{}
,False
y falsos como los valores, que no es lo que pidió el cartel.def xstr(s): return str(s) or ""
Forma funcional (una línea)
fuente
Una buena frase para hacer esta construcción en algunas de las otras respuestas:
o incluso solo:
fuente
(lambda v: v or '')
?False
lista vacía también se convertirá en ''.0
, etc.fuente
get
.Yo uso la función max:
Funciona como un encanto;) Simplemente ponga su cadena en el primer parámetro de la función.
fuente
Variación sobre lo anterior si necesita ser compatible con Python 2.4
fuente
Si se trata de formatear cadenas, puede hacer lo siguiente:
fuente
fuente
Siempre podemos evitar la conversión de tipos en los escenarios que se explican a continuación.
En el ejemplo anterior, en caso de que el valor del cliente variable sea Ninguno, se convierte más cuando se le asigna 'nombre'. La comparación en la cláusula 'if' siempre fallará.
El ejemplo anterior funcionará correctamente. Tales escenarios son muy comunes cuando los valores se obtienen de URL, JSON o XML o incluso los valores necesitan una conversión de tipo adicional para cualquier manipulación.
fuente
Utilice la evaluación de cortocircuito:
Dado que + no es una muy buena operación en cadenas, mejor use cadenas de formato:
fuente
+
Es un operador perfectamente bueno para dos cadenas. Cuando intentas usarlo para unirte a docenas, tienes problemas. Para dos, probablemente será más rápido que otras opciones; De cualquier manera, está en el ruido.or
) me parece un poco exagerado ... No tengo casos de otros valores falsos, ya sea str o None. Aparte del comentario sobre el+
operador, que podría depender de un escenario específico y podría necesitar una evaluación comparativa, esta respuesta no merece un -1Use la cadena F si está usando Python v3.7
fuente
'None'
sis
es asíNone
.