En algunas ocasiones debemos validar que un diccionario posea ciertas claves, o key
s, existan antes de continuar nuestra lógica. Sino podría fallar la ejecución. Pero la pregunta es… ¿cómo lo podemos hacer de la forma más limpia posible?
Para los ejemplos partimos del siguiente diccionario.
party = {
"name": "Bob",
"age": 20,
"city": "London",
"country": "UK",
"web": "http://example.com",
"twitter": "@bob",
}
Mi objetivo: Quiero un bool
en True
si esta presente todas las claves. En mi caso verificaré name
, age
, city
y country
. En caso que falte tan solo una de ellas, obtendré un False
.
Solución 1: Una larga condicinal
La típica resolución, la más fácil, ante el problema es una condicional.
if "name" in party and "country" in party and "age" in party and "city" in party:
print("Los campos requeridos están presentes")
else:
print("NO todos los campos requeridos están presentes")
# "Los campos requeridos están presentes"
No es perfecta, ya que es verboso y difícil de leer.
Solución 2: set apoyada por issubset
Es más elegante, sin duda alguna, crear un elemento iterable con todas las key
s que necesitas comprobar para a continuación comprobar cada item por separado.
.keys()
nos devolverá el listado con las claves del diccionario.set()
eliminará cualquier repetición.issubset
es una funcionalidad deset
que comprobará si el listado actual corresponde a todos los valores del argumento (party.keys()
).
required_fields = ["name", "country", "age", "city"]
is_all_included = set(required_fields).issubset(party.keys())
if is_all_included:
print("Los campos requeridos están presentes")
else:
print("NO todos los campos requeridos están presentes")
# "Los campos requeridos están presentes"
Solución 3: Crear una función propia usando la lógica anterior
Si el código te ha parecido lo suficientemente interesante, el siguiente paso es crear una función reutilizable, bien documentada y con tipos definidos.
from typing import Mapping, Iterable, Any
def is_all_included(data: Mapping[str, Any], fields: Iterable[str]) -> bool:
"""Comprueba si todos los campos están presentes en el diccionario
Args:
data (dict): Diccionario a comprobar
fields (list|tuple): Campos a comprobar
Returns:
bool: True si todos los campos están presentes, False en caso contrario
"""
return set(fields).issubset(data.keys())
if is_all_included(party, ["name", "country", "age", "city"]):
print("Los campos requeridos están presentes")
else:
print("NO todos los campos requeridos están presentes")
# "Los campos requeridos están presentes"
Mucho más práctico y fácil de testear.
Conclusión
Evitemos siempre que sea posible enormes condicionales costosas de mantener o imposible de reutilizar. Como puedes ver en los ejemplos, puedes construir una pequeña utilidad que resuelva el problema planteado y tal vez muchos otros en un futuro. Por otro lado no menosprecies todo lo que aprenderás por el camino. La curiosidad es un arma muy poderosa en la profesión.
{{ comments.length }} comentarios