Biblioteka attrs
Porównaj attrs z dataclasses
Biblioteka attrs to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.
Czym jest attrs?
attrs to biblioteka zewnętrzna, która wiele lat przed pojawieniem się dataclasses w bibliotece standardowej spopularyzowała koncepcję tworzenia klas na podstawie pól. Standardowy moduł dataclasses został bezpośrednio przez nią zainspirowany.
- attrs wymaga osobnej instalacji:
pip install attrs. - Oferuje więcej funkcji niż dataclasses.
- dataclasses jest wbudowane i zaspokaja większość codziennych potrzeb.
Nowoczesne API attrs
Nowoczesne attrs korzysta z @define i field() z przestrzeni nazw attrs. Struktura jest bardzo podobna do dataclass.
from attrs import define, field
@define
class Point:
x: int
y: int
p = Point(1, 2)
print(p)Domyślne użycie __slots__
Istnieje ważna różnica: klasy @define automatycznie używają __slots__. Zmniejsza to zużycie pamięci i zapobiega przypadkowemu dodawaniu niezadeklarowanych atrybutów. Zwykłe dataclasses używają standardowego __dict__, chyba że przekażą Państwo slots=True (Python 3.10+).
Wbudowane walidatory
attrs zawiera gotowe walidatory. Pole może deklarować walidator uruchamiany podczas tworzenia obiektu, który zgłasza błąd, jeśli wartość jest nieprawidłowa. Dataclasses nie mają wbudowanej walidacji — należy napisać ją samodzielnie w __post_init__.
from attrs import define, field
from attrs.validators import instance_of
@define
class User:
age: int = field(validator=instance_of(int))
User(30) # ok
User('oops') # raises TypeErrorKonwertery
Konwerter przekształca wartość wejściową przed jej zapisaniem. Można na przykład automatycznie przekonwertować ciąg znaków na liczbę całkowitą. To kolejna funkcja, której brakuje w dataclasses.
from attrs import define, field
@define
class Item:
price: int = field(converter=int)
i = Item('42') # stored as the integer 42
print(i.price)Odpowiednik w dataclasses
Oto ten sam pomysł z użyciem biblioteki standardowej. Walidację i konwersję należy ręcznie umieścić w __post_init__, ponieważ dataclasses nie udostępniają punktów zaczepienia dla poszczególnych pól.
from dataclasses import dataclass
@dataclass
class Item:
price: int
def __post_init__(self):
self.price = int(self.price)
print(Item('42'))asdict w obu bibliotekach
Obie biblioteki udostępniają pomocniczą funkcję asdict. Wersja dla dataclass znajduje się w module dataclasses, a wersja dla attrs — w module attrs. Ich działanie jest niemal identyczne.
from dataclasses import dataclass, asdict
@dataclass
class Point:
x: int
y: int
print(asdict(Point(1, 2)))Zamrożenie w attrs
attrs również obsługuje niemutowalność. Należy użyć @frozen (skróconej wersji @define(frozen=True)), aby utworzyć instancje tylko do odczytu, podobnie jak w przypadku @dataclass(frozen=True).
from attrs import frozen
@frozen
class Point:
x: int
y: int
p = Point(1, 2)
print(p)
# p.x = 9 would raise FrozenInstanceErrorPorównanie funkcji
Porównanie wygląda następująco:
- dataclasses: biblioteka standardowa, bez konieczności instalacji, obejmuje podstawowe funkcje.
- attrs: walidatory, konwertery, domyślne użycie slots i więcej możliwości konfiguracji.
- Obie biblioteki generują
__init__,__repr__i__eq__.
Którego rozwiązania użyć?
Proszę wybrać dataclasses w przypadku prostych kontenerów danych, jeśli nie chcą Państwo dodawać zależności. Proszę wybrać attrs, gdy potrzebne są walidatory, konwertery lub bardziej rozbudowana konfiguracja i akceptują Państwo dodatkową zależność. Wiele projektów zaczyna od dataclasses i przechodzi na inne rozwiązanie dopiero wtedy, gdy ich możliwości przestają wystarczać.
Wspólne korzenie
Ponieważ dataclasses czerpie tak wiele z attrs, migracja między nimi jest zwykle mechaniczna: wystarczy zmienić import i dekorator oraz dostosować walidatory lub konwertery. Znajomość jednego rozwiązania sprawia, że drugie staje się od razu znajome.
@defineodpowiada@dataclass.attrs.fieldodpowiadadataclasses.field.- Przy przechodzeniu na dataclasses walidatory należy przenieść do
__post_init__.
Szybkie sprawdzenie
Jaką funkcję oferuje attrs, której standardowy moduł dataclasses nie zapewnia wbudowanej?
Podsumowanie
Porównali Państwo attrs z dataclasses.
- attrs zainspirowało dataclasses i oferuje więcej funkcji.
- attrs dodaje walidatory, konwertery oraz domyślne użycie slots.
- dataclasses jest wbudowane i nie wymaga instalacji.
- Należy wybrać najprostsze narzędzie, które spełnia wymagania.
Często zadawane pytania
Czy lekcja „Biblioteka attrs” jest bezpłatna?
Tak — pełny tekst „Biblioteka attrs” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Biblioteka attrs”?
Porównaj attrs z dataclasses Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Python Academy?
Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Biblioteka attrs”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?
Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.