You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: capitulos/cap08.adoc
+57-46Lines changed: 57 additions & 46 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,38 +1,37 @@
1
1
[[ch_type_hints_def]]
2
2
== Dicas de tipo em funções
3
3
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, Jukka Lehtosalo, 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, Jukka Lehtosalo, 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, Jukka Lehtosalo, 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]
16
15
no Python 2.2, lançado em 2001.
17
16
Entretanto, as dicas de tipo não beneficiam igualmente a todos as pessoas que usam Python.
18
17
Por isso deverão ser sempre opcionais.
19
18
20
19
A
21
20
https://fpy.li/pep484[PEP 484—Type Hints] introduziu a sintaxe e a semântica para declarações explícitas de tipo
22
21
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.
25
24
26
25
Os maiores beneficiários são engenheiros de software profissionais que usam IDEs (_Ambientes de Desenvolvimento Integrados_)
27
26
e CI (_Integração Contínua_).
28
27
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.
29
28
30
29
A base de usuários de Python vai muito além dessa classe de profissionais.
31
30
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 equipes—muitas vezes "equipes solo".
36
35
37
36
A tipagem dinâmica, default de Python, é mais simples e mais expressiva quando
38
37
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:
45
44
46
45
* Uma introdução prática à tipagem gradual com Mypy
47
46
* 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.
51
50
52
51
=== Novidades nesse capítulo
53
52
@@ -61,12 +60,15 @@ Vamos começar definindo o que isso significa.
61
60
62
61
=== Sobre tipagem gradual
63
62
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",
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_:
240
244
241
245
[source]
242
246
----
@@ -495,25 +499,31 @@ Por outro lado, Mypy vai marcar `x * 2` como um erro quando analisar o código-f
495
499
Em um sistema de tipagem gradual, acontece uma interação entre duas perspectivas diferentes de tipo:
496
500
497
501
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.
500
505
Na prática, não importa qual o tipo declarado de um objeto, importam apenas as operações que ele efetivamente suporta.
501
506
Se eu posso invocar `birdie.quack()` então, nesse contexto, `birdie` é um pato.
502
507
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>>.]
504
513
505
514
506
515
Tipagem nominal::
507
516
É a ((("nominal typing"))) perspectiva adotada em {cpp}, Java, e C#, e suportada em Python anotado.
508
517
Objetos e variáveis tem tipos.
509
518
Mas objetos só existem durante a execução, e o verificador de tipo só se importa com o código-fonte,
510
519
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`.
512
522
Mas no corpo da função, o verificador considera a chamada `birdie.quack()` ilegal,
513
523
pois `birdie` é nominalmente um `Bird`, e aquela classe não fornece o método `.quack()`.
514
524
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 lê 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.
517
527
Isso é mais rígido que _duck typing_,
518
528
com a vantagem de capturar alguns bugs durante o desenvolvimento,
519
529
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>>.
629
639
[[birdie_errors_ex]]
630
640
.Erros durante a execução e como o Mypy poderia ter ajudado
631
641
====
632
-
[source, py]
642
+
[source, pycon]
633
643
----
634
644
>>> from birds import *
635
645
>>> woody = Bird()
@@ -656,7 +666,7 @@ expected "Duck"` (_Argumento 1 para `alert_duck` é do tipo incompatível "Bird"
656
666
`"Bird" has no attribute "quack"` (_Bird não tem um atributo "quack"_)
657
667
658
668
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.
660
670
A tipagem nominal detecta os erros antes da execução,
661
671
mas algumas vezes rejeita código que seria executado sem erros—como
662
672
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
674
684
675
685
[NOTE]
676
686
====
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.
679
689
É por essa razão que empresas com milhões de linhas de código em
680
690
Python—como Dropbox, Google e Facebook—investiram em equipes e ferramentas para
681
691
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.
683
694
====
684
695
685
696
Nessa seção exploramos as relações de tipos e operações no duck typing e na tipagem nominal,
0 commit comments