Encadenamiento opcional en Python

Migel Hewage Nimesha 21 junio 2023
  1. Use try-except para implementar el encadenamiento opcional en Python
  2. Use getattr para implementar el encadenamiento opcional en Python
  3. Use get(key, value) para implementar el encadenamiento opcional en Python
  4. Utilice una combinación de métodos para implementar el encadenamiento opcional en Python
  5. Use getattr como complemento para implementar el encadenamiento opcional en Python
  6. Use glom para implementar el encadenamiento opcional en Python
  7. Use un método legible con diccionarios y objetos para implementar el encadenamiento opcional en Python
  8. Conclusión
Encadenamiento opcional en Python

Python es un lenguaje de programación utilizado principalmente en secuencias de comandos del sistema, desarrollo web del lado del servidor y desarrollo de software. Además, consta de sintaxis simples que mejoran la legibilidad del código.

Entre las características de Python, el encadenamiento opcional es una forma segura y concisa de acceder a las propiedades de los objetos anidados. Es el proceso de llamar y consultar las propiedades que pueden ser nulas o no serlo en ese momento.

Al usar el encadenamiento opcional, podemos verificar internamente si una propiedad en un objeto está disponible en lugar de verificar manualmente.

El encadenamiento opcional comprueba si la propiedad que se le deja al operador está definida o no. Si la propiedad no es nula, la llamada tiene éxito y devuelve indefinido si no es válido o no está definido.

Aquí, devuelve un valor indefinido en lugar de informar un error. Además, esto funciona bien con las llamadas a funciones aunque el método no exista.

Este concepto fue presentado recientemente por ECMA International, Comité Técnico 39 - ECMAScript, escrito por Claude Pache, Gabriel Isenberg, Daniel Rosenwasser y Dustin Savery.

Al escribir un código más limpio, el encadenamiento opcional es una buena característica para usar.

A continuación se muestran algunos métodos que podemos usar para implementar el encadenamiento opcional en Python. Podemos usar estos fragmentos de código al construir las funciones.

Use try-except para implementar el encadenamiento opcional en Python

La forma más pitónica de encadenamiento opcional se encuentra a continuación.

try:
    # statements

except (NameError, AttributeError) as e:
    # statements (else)

Este método utiliza el comando intentar y el comando excepto. Dentro de try contiene las sentencias utilizadas para controlar el flujo, mientras que except consta de sentencias utilizadas para manejar los errores que ocurren al pasar las instrucciones al programa.

Cuando se ejecuta un programa, pueden ocurrir excepciones. Luego interrumpen el programa imprimiendo un mensaje que muestra el error y cómo sucedió.

Para evitar interrupciones, tenemos que atraparlos. Por lo tanto, manejar excepciones como esta ayudará a obtener un código a prueba de errores.

Aquí estamos considerando dos errores principales: NameError y AttributeError. Cuando usamos una variable no definida o una función, puede ocurrir NameError.

Si el usuario intenta hacer una referencia de atributo no válida, la referencia fallará y puede ocurrir AttributeError. Además, las variaciones ortográficas aparecerán como AttributeError.

Como se discutió anteriormente, este enfoque pitónico de encadenamiento opcional ayuda a llamar a las propiedades, incluso si están definidas o no, mientras maneja las excepciones.

Use getattr para implementar el encadenamiento opcional en Python

En lugar del método anterior, usar getattr también es otro método en el encadenamiento opcional.

getattr(getattr(foo, "bar", None), "baz", None)

Aquí usamos la función getattr que devuelve el valor del atributo nombrado del objeto especificado. El nombre del objeto debe ser una cadena y, si es un atributo con nombre, devuelve el valor de ese atributo.

Pero, si el atributo nombrado no existe, se devuelve el valor predeterminado o arroja un AttributeError.

Dentro de esta función getattr, getattr(foo, 'bar', None) es el objeto mientras que baz es el atributo y None es el valor predeterminado.

Use get(key, value) para implementar el encadenamiento opcional en Python

Podemos usar get(key, value) cuando se trata de un diccionario.

{"foo": {"bar": "baz"}}.get("foo", {}).get("bar")

El diccionario es una colección de valores de datos ordenados, modificables y no duplicados almacenados como pares clave: valor. Aquí, 'foo', 'bar' y 'baz' son los marcadores de posición que usamos en Python.

{'foo': {'bar': 'baz'}} es el diccionario, y con él, estamos usando dos funciones get con una clave y un valor. Aquí, la función get devuelve el valor del elemento con la clave especificada.

La primera función get consiste en una tecla como 'foo' y un valor de {} mientras que la segunda consiste solo en una tecla como 'bar'.

Como en el fragmento de código anterior, podemos adaptar el concepto de encadenamiento opcional incluso cuando usamos un diccionario.

Utilice una combinación de métodos para implementar el encadenamiento opcional en Python

A continuación se muestra otro método que podemos seguir en el encadenamiento opcional. Es una combinación de métodos.

from functools import reduce


def optional_chain(obj, keys):
    try:
        reduce(getattr, keys.split("."), root)
    except AttributeError:
        return None


optional_chain(foo, "bar.baz")

Primero, tenemos que importar el módulo reduce de las functools que almacenan el resultado intermedio y devuelven solo la suma final. Luego se define la función opcional_cadena con dos parámetros.

Después de eso, podemos adaptar el primer método discutido con los controles try y except. Dentro de los comandos try y except, hemos utilizado la función getattr.

Hemos descrito la funcionalidad de getattr en el segundo método. Finalmente, llamamos a la cadena_opcional definiendo dos parámetros.

Use getattr como complemento para implementar el encadenamiento opcional en Python

Podemos usarlo como complemento sin extender el getattr como se indicó anteriormente.

from functools import reduce


def rgetattr(obj, attr, *args):
    def _getattr(obj, attr):
        return getattr(obj, attr, *args)

    return reduce(_getattr, attr.split("."), obj)

Después de importar el módulo, definimos una función llamada rgetattr con tres parámetros. Luego definimos la función getattr como un drop-in.

Si la ruta no existe, rgetattr arrojará un AttributeError, y podemos especificar por defecto en lugar de Ninguno.

Use glom para implementar el encadenamiento opcional en Python

Otro método que podemos usar en el encadenamiento opcional es usar glom.

from glom import glom

target = {"a": {"b": {"c": "d"}}}
glom(target, "a.b.c", default=None)

Como primer paso, debemos importar el módulo glom de la biblioteca. Luego, el objetivo se ha definido en forma de diccionario con a, b, y c. Además, d es el valor correspondiente de c.

Después de eso, la función glom ha llamado con objetivo y a.b.c dentro de ella. Si ocurre alguna excepción, imprimirá Ninguno como valor predeterminado.

Use un método legible con diccionarios y objetos para implementar el encadenamiento opcional en Python

Al adaptarnos al siguiente método, podemos hacer que el código sea más legible cuando se usa con diccionarios y objetos.

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

Al principio, definía una función llamada opcional_cadena y procedía con un bucle for y declaraciones if-else. Usó la función getattr dentro del flujo para obtener el resultado en la parte else.

Debemos agregar teclas después del primer argumento cuando usamos esta función.

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

Conclusión

En general, los métodos anteriores son las formas en que podemos adaptarnos cuando necesitamos un encadenamiento opcional en Python.

Podemos utilizar los enfoques probar y excepto y evitar optimizaciones prematuras si conocemos el proceso y el problema de rendimiento que resolvemos. Además, podemos tener un reflejo del código usando getattr.

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.