Isso funciona? É pythonico? Pode ser um caminho? Qual a diferença do módulo typing pra lib mypy?
Python é uma linguagem de tipagem forte e dinâmica(ou será que ainda é?), mas desde sua versão 3.5, com o módulo typing, é possível utilizar uma tipagem mais explícita sem alterar todo códi...
Isso funciona? É pythonico? Pode ser um caminho? Qual a diferença do módulo typing pra lib mypy?
Python é uma linguagem de tipagem forte e dinâmica(ou será que ainda é?), mas desde sua versão 3.5, com o módulo typing, é possível utilizar uma tipagem mais explícita sem alterar todo código. mypy é um projeto que nos possibilita também utilizar tipagem estática de maneira similar ao typing, embora o mypy seja mais antigo e também suporta Python 2 enquanto o módulo typing funciona apenas com Python 3.
Vamos discutir, ver exemplos de aplicação, mostrando tanto o uso com a biblioteca mypy quanto com o módulo nativo typing(python >= 3.5), bem como (des)vantagens e onde/quando usar, ou não, tipagem estática.
Size: 302.58 KB
Language: pt
Added: Jun 10, 2017
Slides: 25 pages
Slide Content
Python e Tipagem Estática
Carlos Coelho
Quem sou eu
●Carlos Coelho
○Gama - DF/Recife - PE
○Engenharia da Software - UnB
○Torcedor do maior campẽao do DF Gama
○5 anos como desenvolvedor
xpto: int = ‘a’ # linter acusa erro
# mas roda normal
sane_world: bool
if 2 + 2 == 4:
sane_world = True
else:
sane_world = False
Na prática
484
def greetings(name: str) -> str:
return “hello” + name
# funciona em Python 2 também!
def greetings(name):
# type: (str) -> str
return “hello” + name
# pode-se utilizar dicts
xpto: Dict[str, int] = {}
# ou até listas
xpto: List[int] = []
PEP 484 tl;dr
●Sintaxe padrão
●Facilita a análise estática e refatoração
●Potencial para checagem de tipos em runtime
●Notação padrão para IDEs/editores de texto
●Checagem de tipos em runtime por terceiros
PEP 526 tl;dr
●Type comments tem algumas desvantagens
○Highlight de comentários != highlight type annotations
○Não há como informar o tipo de uma variável indefinida, é preciso inicializá-la
com None
○Variáveis anotadas em um condicional(if/else) podem dificultar a leitura
●Sintaxe no core da linguagem
●Sintaxe dedicada pode levar a duck-typing estático
●Type annotations != declaração de variáveis
Python continua sendo
uma linguagem
dinamicamente tipada
mypy? typing?
Benefícios
●Facilita entendimento e manutenção do código
●Facilita encontrar bugs em codebases grandes
●Melhoria em suporte para auto-complete e análise de código por
IDEs/editores de texto
●Utilizar tipagem dinâmica e estática ao mesmo tempo
[mypy]
ignore_missing_imports = True
follow_imports = skip
strict_optional = True
Exemplo de um arquivo mypy.ini localizado na raiz de um projeto X
Configurar mypy
Experiência na Vinta
Ainda não é um mar de rosas...
●Funciona em runtime, mas falha na análise estática
●Problema real:
○Callable[[Union[bytes, bytesarray], int] e Callable[[bytes], None]
são compatíveis, mas o linter não concorda :(
■Resolverá com PEP 544
def download_euipo_file(ftp_conn: FTP, filepath: str) ->
None:
euipo_file = BytesIO()
ftp_conn.retrbinary(“RETR {}”.format(filepath),
euipo_file.write)
Se caminha como um pato, nada como um pato e grasna como um pato,
provavelmente é um pato.
Duck Typing
class Pato:
def quack(self):
print("Quack, quack!")
def fly(self):
print("Flap, Flap!")
class Pessoa:
def quack(self):
print("I'm Quackin'!")
Alguns projetos em andamento
●API Star
○https://github.com/tomchristie/apistar
●pydantic
○https://github.com/samuelcolvin/pydantic
Outras referências
●What is Gradual Typing
○https://wphomes.soic.indiana.edu/jsiek/what-is-gradual-typing/
●Static types in Python, oh my(py)!
○http://blog.zulip.org/2016/10/13/static-types-in-python-oh-mypy/
●Proposal: Use mypy syntax for function annotations - BDFL
○https://mail.python.org/pipermail/python-ideas/2014-August/02861
8.html
●Adding Optional Static Typing to Python - BDFL
○http://www.artima.com/weblogs/viewpost.jsp?thread=85551
Outras referências
●Jukka Lehtosalo, David Fisher Static Types for Python PyCon 2017
○https://www.youtube.com/watch?v=7ZbwZgrXnwY
●Guido van Rossum - Type Hints for Python 3.5 EuroPython 2015
○https://www.youtube.com/watch?v=Yqnrfa5ri7E
●Pycon UK 2016: Python and static types: Let's use mypy!
○https://www.youtube.com/watch?v=ddKQJTzgELw
●What Python can learn from Haskell? EuroPython 2014
○http://bob.ippoli.to/python-haskell-ep2014/#/title