Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> python

Python Attrs:Clases de datos avanzadas, con código de ejemplo

El paquete Python Attrs le permite crear clases de datos avanzadas usando anotaciones simples. Por supuesto, python también tiene su propio módulo de clase de datos nativo, ¡pero el paquete Python attrs ofrece un par de características adicionales que te pueden gustar!

Tabla de contenidos

  • Instalar atributos
  • Atributos frente a clases de datos
  • Un ejemplo básico de atributos de Python
  • Ejemplo de validador de atributos de Python
  • Ejemplo de convertidor de atributos de Python
  • Uso de espacios con atributos de Python
  • Sigue aprendiendo

Instalar atributos

El paquete attrs no forma parte de la biblioteca base, por lo que deberá instalarlo con el comando pip install o algo similar, como Pipenv. Probablemente también desee crear un entorno virtual, para que no interfiera con otros proyectos que tenga. El paquete se llama attrs, por lo que su instalación se verá así:

$ pip install attrs

# or with pipenv:
$ pipenv install attrs

Atributos frente a clases de datos

Los autores de attrs de hecho, han trabajado en el PEP que introdujo clases de datos en Python. Las clases de datos nativos de Python se mantienen intencionalmente más simples y fáciles de entender, mientras que los atractivos ofrecen la gama completa de características que podría desear.

Algunas de las razones para elegir Python attrs sobre las clases de datos incorporadas son:

  • Está utilizando una versión de Python anterior a la 3.7. Attrs lo tiene cubierto, ya que es compatible con todas las versiones principales de Python, incluidas CPython 2.7 y PyPy.
  • Quieres más funciones:attrs ofrece validadores y convertidores
  • Desea un rendimiento óptimo y un uso mínimo de memoria mediante las clases ranuradas attrs

Un ejemplo básico de atributos de Python

Veamos primero un ejemplo muy básico:

import attr

@attr.s
class Person(object):
    name = attr.ib(default='John')
    surname = attr.ib(default='Doe')
    age = attr.ib(init=False)
    
p = Person()
print(p)
p = Person('Bill', 'Gates')
p.age = 60
print(p)

# Output: 
#   Person(name='John', surname='Doe', age=NOTHING)
#   Person(name='Bill', surname='Gates', age=60)

Un par de observaciones:

  • La sintaxis es menos elegante y más detallada que la de las clases de datos, pero obtiene funciones adicionales a cambio.
  • De manera similar a las clases de datos, obtiene una representación bien formateada de sus datos cuando los imprime.
  • El paquete attrs utiliza nombres elegidos inteligentemente como attr.ib , por lo que solo necesita importar attr. También puede importar los nombres completos. Por ejemplo con from attr import attrib, attrs y utilice esos nombres en su lugar. La funcionalidad es la misma.

A continuación, veamos las características más importantes que ofrece este paquete sobre las clases de datos regulares:validadores y convertidores.

Ejemplo de validador de atributos de Python

Puede agregar validadores a su clase de datos attrs de dos maneras:

  1. Usando un decorador
  2. Proporcionando una función invocable

Demostraré el método de función invocable aquí primero. Attrs ofrece varios validadores listos para usar, de los cuales usaremos el instance_of validador en el siguiente ejemplo:

>>> @attr.s
... class C(object):
...     x = attr.ib(validator=attr.validators.instance_of(int))
>>> C(42)
C(x=42)
>>> C("a string")

Traceback (most recent call last):
   ...
TypeError: ("'x' must be <type 'int'> (got 'a string' that is a <type 'str'>).", ...

Dado que intentamos crear un objeto C con un valor de cadena para x, el validador de instancia_of arroja un error porque requiere un tipo int en lugar de una cadena.

Ahora definamos nuestro propio validador:

import attr

@attr.s
class DividableByTwo(object):
    x = attr.ib()

    @x.validator
    def check(self, attribute, value):
        if value % 2 != 0:
            raise ValueError(f'{value} is not dividable by 2')

print (DividableByTwo(60))
print (DividableByTwo(11))

# Output will be something like:
# DividableByTwo(x=60)
# ...
# ValueError: 11 is not dividable by 2

Ejemplo de convertidor de atributos de Python

Un convertidor toma el valor establecido y lo convierte automáticamente. Puedes usar esto para todo tipo de propósitos. Un ejemplo es convertir automáticamente un valor a un int. Nuevamente, comencemos usando una función invocable, en este caso simplemente usamos la función int() de Python:

import attr

@attr.s
class C(object):
    x = attr.ib(converter=int)

c = C("1")
print(c)
# Output:
# C(x=1)

Nuestra entrada (la cadena "1") se convirtió en un número entero automáticamente. Debido a que los convertidores se ejecutan antes que los validadores, puede validar el valor final después de la conversión. Por ejemplo, puede usar los dos ejemplos anteriores para convertir primero cualquier entrada a int y luego verificar si el valor es divisible por dos.

Uso de tragamonedas con atributos de Python

Finalmente, puede decirle a attrs que use clases ranuradas. Las clases con franjas horarias tienen algunas ventajas sobre las clases regulares:

  • Tienen una pequeña huella de memoria
  • Son más rápidos

En resumen, con una clase ranurada, establece explícitamente qué atributos de instancia espera que tengan sus instancias de objetos. De esta manera, Python puede omitir algunas comprobaciones y demás, lo que resulta en un menor uso de memoria y ligeros aumentos de velocidad. Puede encontrar más detalles en la documentación de attrs aquí.

Sin embargo, las clases ranuradas también vienen con advertencias, especialmente cuando las creas manualmente. Afortunadamente, attrs nos ofrece una forma sencilla de habilitar la función:

import attr

@attr.s(slots=True)
class YourClassName:
    ...

Sigue aprendiendo

  • Nuestro artículo sobre las clases de datos de Python
  • Nuestro tutorial sobre clases y objetos de Python
  • Para obtener más ejemplos, consulte la página de ejemplos de attrs

python

  1. Tipos de datos de Python
  2. Python String strip() Función con EJEMPLO
  3. Python String count () con EJEMPLOS
  4. Función Python round() con EJEMPLOS
  5. Función Python map() con EJEMPLOS
  6. Python Timeit() con ejemplos
  7. Contador de Python en colecciones con ejemplo
  8. Python time.sleep():agregue retraso a su código (ejemplo)
  9. Python List count () con EJEMPLOS
  10. Índice de lista de Python () con ejemplo
  11. Python - Programación de extensiones con C