Python tiene una biblioteca llamada attrs que hace que el código escrito en un modo orientado a objetos sea mucho más fácil y conciso. En una clase que tiene datos, es mejor transformarlos en un diccionario. Podemos usar la función attr.asdict() en Python para devolver los valores de atributo attrs de i como dict.
Sintaxis: attr.asdict (inst, recurse: bool=True, filter: __class__=Ninguno, dict_factory: , retain_collection_types: bool=False)
Parámetros:
inst : instancia de una clase decorada con attrs
recurse : (booleano) recurse en clases que también están decoradas con
attrs dict_factory : un invocable para producir diccionarios de
filter : un invocable que determina si un atributo está incluido (Verdadero) o descartado ( False)
retain_collection_types : solo tiene sentido si recurse es True.
Ejemplo 1: Tomemos un ejemplo muy simple de coordenadas de clase que acepta coordenadas como atributos.
Python3
# import library import attr # initialising class Coordinates, no need to # initialize __init__ method @attr.s class Coordinates(object): # attributes x = attr.ib() y = attr.ib() c1 = Coordinates(1, 2) # converting data into dict using attr.asdict() # function print(attr.asdict(Coordinates(x=1, y=2)))
Producción:
{'x': 1, 'y': 2}
Aquí, los datos pasados se convierten en un formulario de diccionario.
Ejemplo 2: aquí hay otro ejemplo de información de usuario de clase que aceptará el nombre y la identificación de correo electrónico del usuario como atributos, pero no incluirá la identificación de correo electrónico del usuario en forma de dictado de datos.
Python3
import attr @attr.s class UserInfo(object): users = attr.ib() @attr.s class User(object): email = attr.ib() name = attr.ib() # including only name and not email attr.asdict(UserInfo([User("lee@har.invalid", "Lee"), User("rachel@har.invalid", "Rachel")]), filter=lambda attr, value: attr.name != "email")
Producción:
{'users': [{'name': 'Lee'}, {'name': 'Rachel'}]}
Aquí obtendremos un diccionario anidado con el correo electrónico del usuario excluido.
Ejemplo 3: podemos probar un enfoque diferente para incluir o excluir un atributo utilizando el filtro de parámetros de la función attr.asdict().
Python3
import attr @attr.s class UserInfo(object): name = attr.ib() password = attr.ib() age = attr.ib() # excluding attributes print(attr.asdict(UserInfo("Marco", "abc@123", 22), filter=attr.filters.exclude( attr.fields(UserInfo).password, int))) @attr.s class Coordinates(object): x = attr.ib() y = attr.ib() z = attr.ib() # inclusing attributes print(attr.asdict(Coordinates(20, "5", 3), filter=attr.filters.include(int)))
Producción:
{'name': 'Marco'} {'x': 20, 'z': 3}
Aquí, en la clase UserInfo , hemos pasado tres argumentos nombre, contraseña y edad, de los cuales edad es un valor entero y los valores restantes son strings. En el parámetro de filtro, hemos excluido atributos: contraseña y valores enteros (aquí -edad), por lo que la contraseña y la edad se excluirán del diccionario.
En la clase Coordinates , hemos pasado tres argumentos: coordenadas x, y y z. Aquí la coordenada y se pasa como una string. En el parámetro de filtro, hemos incluido valores enteros. Por lo tanto, las coordenadas x y z se incluyen en el diccionario final. Si la coordenada y se hubiera pasado como un número entero, también se habría incluido.
Publicación traducida automáticamente
Artículo escrito por devanshigupta1304 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA