Skip to content

Commit 61a92f4

Browse files
committed
cap08: rev LR (WIP)
1 parent 1cc447d commit 61a92f4

File tree

1 file changed

+57
-46
lines changed

1 file changed

+57
-46
lines changed

capitulos/cap08.adoc

Lines changed: 57 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,37 @@
11
[[ch_type_hints_def]]
22
== Dicas de tipo em funções
33

4-
++++
5-
<blockquote>
6-
<p>É preciso enfatizar que <strong>Python continuará sendo uma linguagem de tipagem dinâmica, e os autores não tem qualquer intenção de algum dia tornar dicas de tipo obrigatórias, mesmo que por <span class="keep-together">mera convenção</span>.</strong></p>
7-
<p data-type="attribution">Guido van Rossum&#44; Jukka Lehtosalo&#44; e Łukasz Langa, PEP 484—Type Hints<span data-type="footnote"><a href="https://fpy.li/8-1"> PEP 484—Type Hints</a> (EN), "Rationale and Goals"; negritos mantidos do original.</span></p>
8-
</blockquote>
9-
++++
10-
// [quote, Guido van Rossum&#44; Jukka Lehtosalo&#44; and Łukasz Langa, PEP 484—Type Hints]
11-
// ____
12-
// It should also be emphasized that *Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention*.footnote:[https://fpy.li/8-1[PEP 484—Type Hints], section _Rationale and Goals_; bold emphasis retained from the original.]
13-
// ____
14-
15-
Dicas de tipo((("functions, type hints in", "benefits and drawbacks of")))((("type hints (type annotations)", "benefits and drawbacks of"))) foram a maior mudança na história de Python desde https://fpy.li/descr101[a unificação de tipos e classes]
4+
[quote, Guido van Rossum&#44; Jukka Lehtosalo&#44; and Łukasz Langa, PEP 484—Type Hints]
5+
____
6+
É preciso enfatizar que *Python continuará sendo uma linguagem de tipagem dinâmica,
7+
e os autores não tem qualquer intenção de algum dia tornar dicas de tipo obrigatórias,
8+
mesmo por mera convenção*.footnote:[https://fpy.li/8-1[PEP 484—Type Hints], seção _Rationale and Goals_; negritos mantidos do original.]
9+
____
10+
11+
Dicas de tipo((("functions, type hints in",
12+
"benefits and drawbacks of")))((("type hints (type annotations)", "benefits and drawbacks of")))
13+
foram a maior mudança na história de Python desde
14+
https://fpy.li/descr101[a unificação de tipos e classes]
1615
no Python 2.2, lançado em 2001.
1716
Entretanto, as dicas de tipo não beneficiam igualmente a todos as pessoas que usam Python.
1817
Por isso deverão ser sempre opcionais.
1918

2019
A
2120
https://fpy.li/pep484[PEP 484—Type Hints] introduziu a sintaxe e a semântica para declarações explícitas de tipo
2221
em argumentos de funções, valores de retorno e variáveis.
23-
O objetivo é ajudar ferramentas de desenvolvimento a encontrarem bugs nas bases de código em Python
24-
através de análise estática, isto é, sem precisar efetivamente executar o código através de testes.
22+
O objetivo é ajudar ferramentas de desenvolvimento a encontrarem bugs no código-fonte de programas em Python
23+
através de análise estática, isto é, sem executar o código através de testes.
2524

2625
Os maiores beneficiários são engenheiros de software profissionais que usam IDEs (_Ambientes de Desenvolvimento Integrados_)
2726
e CI (_Integração Contínua_).
2827
A análise de custo-benefício que torna as dicas de tipo atrativas para esse grupo não se aplica a todos os usuários de Python.
2928

3029
A base de usuários de Python vai muito além dessa classe de profissionais.
3130
Ela inclui cientistas, comerciantes, jornalistas, artistas, inventores, analistas e estudantes de inúmeras áreas, entre outros.
32-
Para a maioria deles, o custo de aprender dicas de tipo será certamente maior--a menos que
33-
já conheçam uma outra linguagem com tipos estáticos, subtipos e tipos genéricos.
34-
Os benefícios serão menores para muitos desses usuários, dada a forma como que eles interagem com Python,
35-
o tamanho menor de suas bases de código e de suas equipes -- muitas vezes "equipes de um".
31+
Para a maioria dessas pessoas, o custo de aprender dicas de tipo será maior--exceto para
32+
a minoria que já conhece outra linguagem com tipos estáticos, subtipos e tipos genéricos.
33+
Os benefícios serão menores para muitas pessoas, dada a forma como que elas interagem com Python,
34+
o tamanho menor de suas bases de código e de suas equipesmuitas vezes "equipes solo".
3635

3736
A tipagem dinâmica, default de Python, é mais simples e mais expressiva quando
3837
programamos para explorar dados e ideias, como é o caso em ciência de dados, computação criativa e para aprender.
@@ -45,9 +44,9 @@ tópicos mais importantes aqui são:
4544

4645
* Uma introdução prática à tipagem gradual com Mypy
4746
* As perspectivas complementares da duck typing (_tipagem pato_) e da tipagem nominal
48-
* A revisão para principais categorias de tipos que podem surgir em anotações (cerca de 60% do capítulo)
49-
* Os parâmetros variádicos das dicas de tipo (`\*args`, `**kwargs`)
50-
* As limitações e desvantagens das dicas de tipo e da tipagem estática.
47+
* A revisão das principais categorias de tipos que podem surgir em anotações (cerca de 60% do capítulo)
48+
* Dicas de tipo em parâmetros variádicos (`\*args`, `**kwargs`)
49+
* Limitações e desvantagens das dicas de tipo e da tipagem estática.
5150

5251
=== Novidades nesse capítulo
5352

@@ -61,12 +60,15 @@ Vamos começar definindo o que isso significa.
6160

6261
=== Sobre tipagem gradual
6362

64-
A PEP 484((("functions, type hints in", "gr adual typing", id="FTHgrad08")))((("type hints (type annotations)", "gradual typing", id="THgrad0 8")))((("gradual type system", "basics of"))) introduziu no Python um _sistema de tipagem gradual_.
65-
Outras linguagens com sistemas de tipagem gradual são o Typescript da Microsoft,
63+
A PEP 484((("functions, type hints in", "gr adual typing",
64+
id="FTHgrad08")))((("type hints (type annotations)", "gradual typing",
65+
id="THgrad0 8")))((("gradual type system", "basics of")))
66+
introduziu no Python um _sistema de tipagem gradual_.
67+
Outras linguagens com sistemas de tipagem gradual são Typescript da Microsoft,
6668
Dart (a linguagem do SDK Flutter, criado pelo Google),
67-
e o Hack (um dialeto de PHP criado para uso na máquina virtual HHVM do Facebook).
69+
e Hack (um dialeto de PHP que é compilado para a máquina virtual HHVM do Facebook).
6870
O próprio verificador de tipo MyPy começou como uma linguagem:
69-
um dialeto de Python de tipagem gradual com seu próprio interpretador.
71+
um dialeto de Python de tipagem gradual com seu próprio interpretador.
7072
Guido van Rossum convenceu o criador do MyPy, Jukka Lehtosalo,
7173
a transformá-lo em uma ferramenta para checar código Python anotado.
7274

@@ -93,7 +95,7 @@ Não captura erros de tipagem durante a execução do código::
9395
Dicas de tipo são usadas por checadores de tipos, analisadores de código-fonte (_linters_) e IDEs para emitir avisos.
9496
Eles não evitam que valores inconsistentes sejam passados para funções ou atribuídos a variáveis durante a execução.
9597
Por exemplo, nada impede que alguém chame
96-
`tokenie(42)`, apesar da anotação de tipo do argumento `s: str`).
98+
`tokenize(42)`, apesar da anotação de tipo do argumento `s: str`.
9799
A chamada ocorrerá, e teremos um erro de execução no corpo da função.
98100
Não melhora o desempenho::
99101
Anotações de tipo fornecem dados que poderiam, em tese, permitir otimizações do bytecode gerado.
@@ -107,9 +109,11 @@ e gera código de máquina otimizado para aqueles tipos concretos.]
107109
O melhor aspecto de usabilidade da tipagem gradual é que as anotações são sempre opcionais.
108110

109111
Nos sistemas de tipagem estáticos, a maioria das restrições de tipo são fáceis de expressar,
110-
muitas são desajeitadas, muitas são difíceis e algumas são impossíveis: Por exemplo, em julho de 2021,
111-
tipos recursivos não tinham suporte -- veja as questões https://fpy.li/8-2[#182, Define a JSON type] (EN)
112-
sobre o JSON e https://fpy.li/8-3[#731, Support recursive types] (EN) do MyPy.
112+
muitas são desajeitadas, muitas são difíceis e algumas são impossíveis.
113+
Por exemplo, em julho de 2021,
114+
tipos recursivos não tinham suporte—veja as questões
115+
https://fpy.li/8-2[#182, Define a JSON type] (EN)
116+
https://fpy.li/8-3[#731, Support recursive types] (EN) do MyPy.
113117

114118
É perfeitamente possível que você escreva um ótimo programa Python,
115119
que consiga passar por uma boa cobertura de testes,
@@ -127,8 +131,8 @@ para que o checador de tipos ignore certas linhas do seu código.
127131
Tentar impor uma cobertura de 100% de dicas de tipo irá provavelmente estimular seu uso de forma impensada,
128132
apenas para satisfazer essa métrica.
129133
Isso também vai impedir equipes de aproveitarem da melhor forma possível o potencial e a flexibilidade de Python.
130-
Código sem dicas de tipo deveria ser aceito sem objeções quando anotações tornassem
131-
o uso de uma API menos amigável ou quando complicassem em demasia seu desenvolvimento.
134+
Código sem dicas de tipo deve ser aceito sem objeções quando anotações tornam
135+
o uso de uma API menos amigável ou quando complicam demais seu desenvolvimento.
132136
====
133137

134138
=== Tipagem gradual na prática
@@ -193,7 +197,7 @@ E quando você estiver lendo essas linhas, talvez os resultados também sejam di
193197
Se a assinatura de uma função não tem anotações, Mypy a ignora por default—a menos que seja configurado de outra forma.
194198

195199
O <<msgs_test_no_hints>> também inclui testes de unidade do `pytest`.
196-
Este é código de _messages_test.py_.
200+
Este é o código de _messages_test.py_:
197201

198202
[[msgs_test_no_hints]]
199203
._messages_test.py_ sem dicas de tipo.
@@ -226,17 +230,17 @@ Found 3 errors in 2 files (checked 1 source file)
226230

227231
Nas primeiras etapas da tipagem gradual, prefiro usar outra opção:
228232

229-
`--disallow-incomplete-defs`.
233+
`--disallow-incomplete-defs`
230234

231-
Inicialmente o Mypy não me dá nenhuma nova informação:
235+
Com ela, o Mypy não me dá nenhuma nova informação num primeiro momento:
232236

233237
[source]
234238
----
235239
…/no_hints/ $ mypy --disallow-incomplete-defs messages_test.py
236240
Success: no issues found in 1 source file
237241
----
238242

239-
Agora vou acrescentar apenas o tipo do retorno a `show_count` em _messages.py_:
243+
Agora acrescento apenas o tipo do retorno a `show_count` em _messages.py_:
240244

241245
[source]
242246
----
@@ -495,25 +499,31 @@ Por outro lado, Mypy vai marcar `x * 2` como um erro quando analisar o código-f
495499
Em um sistema de tipagem gradual, acontece uma interação entre duas perspectivas diferentes de tipo:
496500

497501
Duck typing ("tipagem pato")::
498-
A ((("duck typing"))) perspectiva adotada pelo Smalltalk — a primeira linguagem orientada a objetos — bem como em Python, JavaScript, e Ruby.
499-
Objetos tem tipo, mas variáveis (incluindo parâmetros) não.
502+
A ((("duck typing"))) perspectiva adotada pelo Smalltalk—a primeira linguagem orientada a objetos—bem
503+
como em Python, JavaScript, e Ruby.
504+
Objetos tem tipo, mas variáveis (incluindo parâmetros) não tem.
500505
Na prática, não importa qual o tipo declarado de um objeto, importam apenas as operações que ele efetivamente suporta.
501506
Se eu posso invocar `birdie.quack()` então, nesse contexto, `birdie` é um pato.
502507
Por definição, duck typing só é aplicada durante a execução, quando se tenta aplicar operações sobre os objetos.
503-
Isso é mais flexível que a _tipagem nominal_, ao preço de permitir mais erros durante a execução.footnote:[Duck typing é uma forma implícita de _tipagem estrutural_, que Python passou a suportar após a versão 3.8, com a introdução de `typing.Protocol`. Vamos falar disso mais adiante nesse capítulo - em <<protocols_in_fn>> — e com mais [.keep-together]#detalhes em# <<ch_ifaces_prot_abc>>.]
508+
Isso é mais flexível que a _tipagem nominal_,
509+
ao preço de permitir mais erros durante a execução.footnote:[Duck typing é uma forma implícita de
510+
_tipagem estrutural_, que as anotações de tipo passaram a suportar explicitamente após a versão 3.8,
511+
com a introdução de `typing.Protocol`.
512+
Vamos falar disso mais adiante nesse capítulo, em <<protocols_in_fn>>, e com mais detalhes no <<ch_ifaces_prot_abc>>.]
504513

505514

506515
Tipagem nominal::
507516
É a ((("nominal typing"))) perspectiva adotada em {cpp}, Java, e C#, e suportada em Python anotado.
508517
Objetos e variáveis tem tipos.
509518
Mas objetos só existem durante a execução, e o verificador de tipo só se importa com o código-fonte,
510519
onde as variáveis (incluindo parâmetros de função) tem anotações com dicas de tipo.
511-
Se `Duck` é uma subclasse de `Bird`, você pode atribuir uma instância de `Duck` a um parâmetro anotado como `birdie: Bird`.
520+
Se `Duck` é uma subclasse de `Bird`,
521+
você pode atribuir uma instância de `Duck` a um parâmetro anotado como `birdie: Bird`.
512522
Mas no corpo da função, o verificador considera a chamada `birdie.quack()` ilegal,
513523
pois `birdie` é nominalmente um `Bird`, e aquela classe não fornece o método `.quack()`.
514524
Não interessa que o argumento real, durante a execução, é um `Duck`,
515-
porque a tipagem nominal é aplicada de forma estática.
516-
O verificador de tipo não executa qualquer pedaço do programa, ele apenas o código-fonte.
525+
porque a tipagem nominal é verificada estaticamente.
526+
O verificador de tipo não executa qualquer pedaço do programa, ele apenas analisa o código-fonte.
517527
Isso é mais rígido que _duck typing_,
518528
com a vantagem de capturar alguns bugs durante o desenvolvimento,
519529
ou mesmo em tempo real, enquanto o código está sendo digitado em um IDE.
@@ -629,7 +639,7 @@ através das mensagens de erro, no <<birdie_errors_ex>>.
629639
[[birdie_errors_ex]]
630640
.Erros durante a execução e como o Mypy poderia ter ajudado
631641
====
632-
[source, py]
642+
[source, pycon]
633643
----
634644
>>> from birds import *
635645
>>> woody = Bird()
@@ -656,7 +666,7 @@ expected "Duck"` (_Argumento 1 para `alert_duck` é do tipo incompatível "Bird"
656666
`"Bird" has no attribute "quack"` (_Bird não tem um atributo "quack"_)
657667

658668
Este pequeno experimento mostra que o duck typing é mais fácil para o iniciante e mais flexível,
659-
mas permite que operações não suportadas causem erros durante a execução.
669+
porém permite que operações não suportadas causem erros durante a execução.
660670
A tipagem nominal detecta os erros antes da execução,
661671
mas algumas vezes rejeita código que seria executado sem erros—como
662672
a chamada a `alert_bird(daffy)` no <<daffy_module_ex>>.
@@ -674,12 +684,13 @@ O checador de tipos impede que muitos erros como esse aconteçam durante a execu
674684

675685
[NOTE]
676686
====
677-
O valor das dicas de tipo é questionável em exemplos minúsculo que cabem em um livro.
678-
Os benefícios crescem conforme o tamanho da base de código afetada.
687+
O valor das dicas de tipo é questionável nos pequenos exemplos que cabem em um livro.
688+
Os benefícios crescem com o tamanho da base de código.
679689
É por essa razão que empresas com milhões de linhas de código em
680690
Python—como Dropbox, Google e Facebook—investiram em equipes e ferramentas para
681691
promover a adoção global de dicas de tipo internamente,
682-
e hoje tem partes significativas e crescentes de sua base de código checadas para tipo em suas linhas (_pipeline_) de integração contínua.
692+
e hoje tem partes significativas e crescentes de sua base de código com
693+
anotações de tipo sendo verificadas em suas _pipelines_ de integração contínua.
683694
====
684695

685696
Nessa seção exploramos as relações de tipos e operações no duck typing e na tipagem nominal,

0 commit comments

Comments
 (0)