type hints w języku python - konradhalas.pl · type hints w języku python konrad hałas...

46
Type hints w języku Python Konrad Hałas 4Developers 2018

Upload: others

Post on 18-Oct-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

Type hints w języku Python

Konrad Hałas

4Developers 2018

Page 2: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy
Page 3: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy
Page 4: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy
Page 5: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy
Page 6: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

Plantype hints

dlaczego?

składnia

narzędzia

biblioteki

projekty legacy

Page 7: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

def notify_everyone(items):    for item in items:        item.owner.notify()

Page 8: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

def cancel_all(items):    notify_everyone(items)    ...

Page 9: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

Rozwiązaniadokumentacja zewnętrzna

dokumentacja w kodzie (RST, epytext, NumPy, Google)

przepisać wszystko do języka statycznie typowanego

Page 10: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy
Page 11: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

def count_unique_words(text, case_sensitive):    ...

Page 12: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

def count_unique_words(text: str, case_sensitive: bool) ‑> int:    ...

Page 13: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

def median(values: list) ‑> float:    ...

Page 14: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from typing import List

def median(values: List[float]) ‑> float:    ...

Page 15: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from typing import Dict

def count_chars(text: str) ‑> Dict[str, int]:    ...

Page 16: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from typing import List

class Point:    ...

def calculate_area(vertices: List[Point]) ‑> float:    ...

Page 17: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from typing import Optional

def total_amount(order: Order, discount: Optional[Discount]) ‑> Money:    ...

Page 18: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from typing import List, Union

def send_confirmation(email: Union[str, List[str]]) ‑> None:    ...

Page 19: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from typing import Any

def get_most_frequent(items: list) ‑> Any:    ...

Page 20: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from typing import List, TypeVar

T = TypeVar('T')

def get_most_frequent(items: List[T]) ‑> T:    ...

Page 21: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy
Page 22: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from typing import List

class Item:    ...

class Basket:

    def __init__(self):        self.items: List[Item] = []

    def add_item(self, item: Item):        self.items.append(item)

Page 23: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

Narzędziamypy

PyCharm

...

Page 24: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

def total_price(items: List[Item], discount: Optional[float] = None) ‑> float:    ...

Page 25: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

def total_price(items: List[Item], discount: Optional[float] = None) ‑> float:    result = 0.0    for item in items:        result += item.count * item.product.price    result ‑= discount    return result

Page 26: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

def total_price(items: List[Item], discount: Optional[float] = None) ‑> float:    result = 0.0    for item in items:        result += item.count * item.product.price    result ‑= discount    return result

 

$ mypy ‑‑strict example.pyexample.py:9: error: "Item" has no attribute "count"example.py:10: error: Unsupported operand types for ‑ ("float" and "Optional[float]")

Page 27: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

def total_price(items: List[Item], discount: Optional[float] = None) ‑> float:    result = 0.0    for item in items:        result += item.quantity * item.product.price    if discount:        result ‑= discount    return result

 

$ mypy ‑‑strict example.py

Page 28: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy
Page 29: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy
Page 30: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

Bibliotekiinjector

dacite

...

Page 31: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

def register_user(user_details: UserDetails):    ...

Page 32: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from users.repositories import UsersRepository

def register_user(user_details: UserDetails):    ...    repository = UsersRepository()    repository.create_user(...)

Page 33: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

class UsersService:

    def __init__(self, repository: UsersRepository):        self.repository = repository

    def register_user(self, user_details: UserDetails):        ...        self.repository.create_user(...)

Page 34: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

class UsersRepository:

    def __init__(self, data_base: DataBase):        self.data_base = data_base

    def create_user(self, user: User):        ...        self.data_base.insert(...)

Page 35: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

class DataBase:

    def __init__(self, session: DataBaseSession):        self.session = session

    ...

Page 36: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

session = DataBaseSession(...)data_base = DataBase(session)users_repository = UsersRepository(data_base)users_service = UsersService(users_repository)

Page 37: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

class DataBaseSession:    ...

class DataBase:

    def __init__(self, session: DataBaseSession):        ...

class UsersRepository:

    def __init__(self, database: DataBase):        ...

class UsersService:

    def __init__(self, repository: UsersRepository):        ...

Page 38: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from injector import inject

class DataBaseSession:    ...

class DataBase:

    @inject    def __init__(self, session: DataBaseSession):        ...

class UsersRepository:

    @inject    def __init__(self, database: DataBase):        ...

class UsersService:

    @inject    def __init__(self, repository: UsersRepository):        ...

Page 39: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from injector import Injector

users_service = Injector().get(UsersService)

Page 40: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

from dataclasses import dataclass

@dataclassclass User:    name: str    age: int    is_active: bool

user = User(name='John', age=30, is_active=True)

Page 41: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

import dacite

data = {    'name': 'John',    'age': 30,    'is_active': True,}

user = dacite.from_dict(data_class=User, data=data)

assert user == User(name='John', age=30, is_active=True)

Page 42: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

Type hints w projekcie legacygradual typing

statyczna analiza uruchamiana w ramach CI

wymuszanie type annotations dla:kluczowych modułów

interfejsów

Page 43: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

Podsumowaniezrozumiały kod

mniej błędów

nowe możliwości

Page 44: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

Dziękuję!@konradhalas / konradhalas.pl

Page 45: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

Zdjęcia

Jacek Kołodziej ‑ http://kolodziejj.info/

Korsan Studio ‑ http://facebook.com/korsanstudio

Page 46: Type hints w języku Python - konradhalas.pl · Type hints w języku Python Konrad Hałas 4Developers 2018. Plan type hints dlaczego? składnia narzędzia biblioteki projekty legacy

Narzędzia/biblioteki

mypy ‑ http://mypy‑lang.org

PyCharm ‑ https://www.jetbrains.com/pycharm

dacite ‑ https://github.com/konradhalas/dacite

injector ‑ https://github.com/alecthomas/injector