Encadenamiento opcional en Python
-
Use
try-except
para implementar el encadenamiento opcional en Python -
Use
getattr
para implementar el encadenamiento opcional en Python -
Use
get(key, value)
para implementar el encadenamiento opcional en Python - Utilice una combinación de métodos para implementar el encadenamiento opcional en Python
-
Use
getattr
como complemento para implementar el encadenamiento opcional en Python -
Use
glom
para implementar el encadenamiento opcional en Python - Use un método legible con diccionarios y objetos para implementar el encadenamiento opcional en Python
- Conclusión
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
.
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.