Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

314
Vistas
Encadenamiento opcional en Python

En JavaScript, si no estoy seguro de si todos los elementos de la cadena existen o no están definidos, puedo hacer foo?.bar , y si bar no existe en foo , el intérprete lo cortocircuitará en silencio y no arrojará un error .

¿Hay algo similar en Python? Por ahora, lo he estado haciendo así:

 if foo and foo.bar and foo.bar.baz: # do something

Mi intuición me dice que esta no es la mejor manera de verificar si todos los elementos de la cadena existen. ¿Hay una forma más elegante/Pythonic de hacer esto?

over 4 years ago · Hanz Gallego
7 Respuestas
Responde la pregunta

0

Puedes usar getattr :

 getattr(getattr(foo, 'bar', None), 'baz', None)
over 4 years ago · Hanz Gallego Denunciar

0

La forma más pitónica es:

 try: # do something ... except (NameError, AttributeError) as e: # do something else ...
over 4 years ago · Hanz Gallego Denunciar

0

Si es un diccionario, puede usar get(keyname, value)

 {'foo': {'bar': 'baz'}}.get('foo', {}).get('bar')
over 4 years ago · Hanz Gallego Denunciar

0

Combinar algunas de las otras respuestas en una función nos da algo que es fácil de leer y algo que se puede usar con objetos y diccionarios.

 def optional_chain(root, *keys): result = root for k in keys: if isinstance(result, dict): result = result.get(k, None) else: result = getattr(result, k, None) if result is None: break return result

Usando esta función, simplemente agregaría las claves/atributos después del primer argumento.

 obj = {'a': {'b': {'c': {'d': 1}}}} print(optional_chain(obj, 'a', 'b'), optional_chain(obj, 'a', 'z'))

Nos da:

 {'c': {'d': 1}} None
over 4 years ago · Hanz Gallego Denunciar

0

Puedes usar el Glom.

 from glom import glom target = {'a': {'b': {'c': 'd'}}} glom(target, 'abc', default=None) # returns 'd'
over 4 years ago · Hanz Gallego Denunciar

0

Combinando algunas cosas que veo aquí.

 from functools import reduce def optional_chain(obj, keys): try: reduce(getattr, keys.split('.'), root) except AttributeError: return None optional_chain(foo, 'bar.baz')

O en su lugar, extienda getattr para que también pueda usarlo como un reemplazo directo para getattr

 from functools import reduce def rgetattr(obj, attr, *args): def _getattr(obj, attr): return getattr(obj, attr, *args) return reduce(_getattr, attr.split('.'), obj)

Con rgetattr aún puede generar un AttributeError si la ruta no existe, y puede especificar su propio valor predeterminado en lugar de Ninguno.

over 4 years ago · Hanz Gallego Denunciar

0

Me gustan los lenguajes modernos como Kotlin que permiten esto:

 foo?.bar?.baz

Recientemente me divertí intentando implementar algo similar en python: https://gist.github.com/karbachinsky/cc5164b77b09170edce7e67e57f1636c

Desafortunadamente, el signo de interrogación no es un símbolo válido en los nombres de atributos en python, por lo que usé una marca similar de Unicode :)

over 4 years ago · Hanz Gallego Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda