Estoy utilizando una función de biblioteca de terceros que lee un conjunto de palabras clave de un archivo y se supone que devuelve una tupla de valores. Lo hace correctamente siempre que haya al menos dos palabras clave. Sin embargo, en el caso donde solo hay una palabra clave, devuelve una cadena sin formato, no una tupla del tamaño uno. Esto es particularmente pernicioso porque cuando trato de hacer algo como¿Cuál es la mejor práctica para manejar tuplas de valor único en Python?
for keyword in library.get_keywords():
# Do something with keyword
, en el caso de la palabra clave, los for
itera sobre cada carácter de la cadena en la serie, lo que arroja una excepción, en tiempo de ejecución o de lo contrario, pero sin embargo es completamente inútil para mí.
Mi pregunta es doble:
Es evidente que esto es un error en la biblioteca, que está fuera de mi control. ¿Cómo puedo evitarlo?
En segundo lugar, en general, si estoy escribiendo una función que devuelve una tupla, ¿cuál es la mejor práctica para garantizar que las tuplas con un elemento se generan correctamente? Por ejemplo, si tengo
def tuple_maker(values):
my_tuple = (values)
return my_tuple
for val in tuple_maker("a string"):
print "Value was", val
for val in tuple_maker(["str1", "str2", "str3"]):
print "Value was", val
Puedo obtener
Value was a
Value was
Value was s
Value was t
Value was r
Value was i
Value was n
Value was g
Value was str1
Value was str2
Value was str3
¿Cuál es la mejor manera de modificar la función my_tuple
para volver realidad una tupla cuando sólo hay un único elemento? ¿Debo explícitamente verificar si el tamaño es 1 y crear la tupla por separado, utilizando la sintaxis (value,)
? Esto implica que cualquier función que tenga la posibilidad de devolver una tupla de un solo valor debe hacer esto, lo que parece raro y repetitivo.
¿Hay alguna solución general elegante a este problema?
No creo que sea "ciertamente" un error. Posiblemente, pero posiblemente su comportamiento previsto (por supuesto, si los documentos dicen que siempre debe devolver una tupla, es un error :) Las partes IIRC del módulo 're' devolverán un elemento individual si solo hay una coincidencia de expresiones regulares, o una tupla de ellos si hay más de uno. –
En general, la comunidad de Python acepta como una mala práctica permitir un valor simple en lugar de 1-tupla, debido a la experiencia negativa con lugares como ese y el operador '%'. Me gustaría presentar un error. – bobince
Es un error o estúpido. Tu eliges. ;) –