Slide 1

Slide 1 text

Python 3.7 Python dataclasses

Slide 2

Slide 2 text

What are data classes? • Introduced in python 3.7 • First and foremost Python classes • Automatically generate special methods for classes • Useful for classes which store multiple properties • Can be used as a mutable data holder • Created using the data_classes decorator from dataclasses import dataclass @dataclass class Person: name: str age: int

Slide 3

Slide 3 text

Storing data in a class: • Using normal python classes • Using named tuples • Using data classes

Slide 4

Slide 4 text

Why not use normal classes? class Person: def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return 'Person(name={0}, age={1})'.format(self.name, self.age) >>> person Person(name=Jane, age=21)

Slide 5

Slide 5 text

Why not use named tuples? from collections import namedtuple Person = namedtuple('Person', ['name', 'age']) person = Person(name='Jane', age=21) >>> print(person) Person(name='Jane', age=21)

Slide 6

Slide 6 text

Creating data classes • Use the dataclass decorator • The decorator examines the class to get field • A field is a class variable with a type annotation from dataclasses import dataclass @dataclass class Person: pass Initializing data classes

Slide 7

Slide 7 text

Creating data classes • Fields are specified as class variables with type annotations • A type hint MUST be provided, or else the field will be ignored • typing.Any can be used to avoid explicitly stating a type from dataclasses import dataclass from typing import Any @dataclass class Person: name: str age: int gender: str id_number: Any Adding fields and type hinting

Slide 8

Slide 8 text

Creating data classes •Default values can also be specified •This is equivalent to specifying default values in the __init__ method from dataclasses import dataclass @dataclass class Person: name: str age: int gender: str marrital_status: str = 'Single' citizenship: str = ‘Kenyan' >>> person = Person(name='Jane', age=21, gender=‘Female’) >>> person.marrital_status ‘Single’ >>> person.citizenship 'Kenyan' Adding default values

Slide 9

Slide 9 text

Creating data classes •Since data classes are still Python classes, we can extend the functionality by adding functions. from dataclasses import dataclass @dataclass class Person: name: str age: int gender: str marrital_status: str = 'Single' citizenship: str = 'Kenyan' @property def is_minor(self): return self.age < 18 >>> person = Person(name='Jane', age=21, gender='Female') >>> person.is_minor False Adding functions

Slide 10

Slide 10 text

Creating data classes • Data classes are mutable by nature which means the values of the fields can be modified • However data classes can be modified to be immutable (similar to namedtuples) • A data class is made immutable by passing frozen=True to the @dataclasses decorator from dataclasses import dataclass # Mutable @dataclass class Person: name: str age: int gender: str >>> person = Person(name='Jane', age=21, gender='Female') >>> person.age 21 >>> person.age = 24 >>> person.age 24 # Immutable @dataclass(frozen=True) class Person: name: str age: int gender: str >>> person.age =24 Traceback (most recent call last): File "", line 1, in person.age =24 File "", line 3, in __setattr__ dataclasses.FrozenInstanceError: cannot assign to field 'age' Mutability

Slide 11

Slide 11 text

Creating data classes • It is possible to generate a dictionary based on a data class and the defined fields. • We use dataclasses.asdict to get a dict representation of the data class. from dataclasses import dataclass from dataclasses import asdict @dataclass class Person: name: str age: int gender: str >>> person = Person(name='Jane', age=21, gender='Female') >>> asdict(person) {'name': 'Jane', 'age': 21, 'gender': 'Female'} To dict

Slide 12

Slide 12 text

Creating data classes •Post-Init Processing •Comparisons Further reading

Slide 13

Slide 13 text

Why use data classes • Automatically adds special methods: • __init__ • __repr__ • __eq__ • __str__ • Adds type hinting • Short learning curve • asdict and astuple to represent data in different formats.

Slide 14

Slide 14 text

• Original PEP: https://www.python.org/dev/ peps/pep-0557 • Further documentation: https:// docs.python.org/3/library/dataclasses.html

Slide 15

Slide 15 text

• QUESTIONS

Slide 16

Slide 16 text

Alex Kiura kiuraalex@gmail.com twitter: @alex_kiura github: alexkiura