|
15 | 15 | A programação orientada a objetos((("interfaces", "role in object-oriented programming"))) |
16 | 16 | tem tudo a ver com interfaces. |
17 | 17 | A melhor abordagem para entender um tipo em Python é conhecer os métodos que |
18 | | -aquele tipo oferece—sua interface—como discutimos na |
19 | | -<<types_defined_by_ops_sec>> do (<<ch_type_hints_def>>). |
| 18 | +aquele tipo oferece—sua interface—como vimos na |
| 19 | +<<types_defined_by_ops_sec>> (<<ch_type_hints_def>>). |
20 | 20 |
|
21 | 21 | Dependendo ((("interfaces", "ways of defining and using"))) da linguagem de programação, |
22 | 22 | temos uma ou mais maneiras de definir e usar interfaces. |
@@ -44,7 +44,7 @@ Duck typing estática:: |
44 | 44 | Uma((("static duck typing"))) abordagem popularizada pela linguagem Go; |
45 | 45 | suportada por subclasses de `typing.Protocol`—lançada no Python 3.8 e |
46 | 46 | também aplicada com o suporte de checadores de tipos externos. |
47 | | - Tratamos desse tema pela primeira vez em <<protocols_in_fn>> (<<ch_type_hints_def>>), |
| 47 | + Tratamos desse tema pela primeira vez em <<protocols_in_fn_sec>> (<<ch_type_hints_def>>), |
48 | 48 | e continuamos nesse capítulo. |
49 | 49 |
|
50 | 50 |
|
@@ -78,7 +78,7 @@ Este((("interfaces", "significant changes to")))((("protocols", "significant cha |
78 | 78 | * A introdução do capítulo e o Mapa de Sistemas de Tipagem (<<type_systems_described>>) são novos. Essa é a chave da maior parte do conteúdo novo - e de todos os outros capítulos relacionados à tipagem em Python ≥ 3.8. |
79 | 79 | * <<two_kinds_protocols_sec>> explica as semelhanças e diferenças entre protocolos dinâmicos e estáticos. |
80 | 80 | * <<defensive_duck_prog_sec>> praticamente reproduz o conteúdo da primeira edição, mas foi atualizada e agora tem um título de seção que enfatiza sua importância. |
81 | | -* <<static_protocols_sec>> é toda nova. Ela se apoia na apresentação inicial em <<protocols_in_fn>> (<<ch_type_hints_def>>). |
| 81 | +* <<static_protocols_sec>> é toda nova. Ela se apoia na apresentação inicial em <<protocols_in_fn_sec>> (<<ch_type_hints_def>>). |
82 | 82 | * Os diagramas de classe de `collections.abc` nas Figuras pass:[<a href="#sequence_uml_repeat" data-type="xref" data-xrefstyle="select:labelnumber">#sequence_uml_repeat</a>], pass:[<a href="#mutablesequence_uml" data-type="xref" data-xrefstyle="select:labelnumber">#mutablesequence_uml</a>], and pass:[<a href="#collections_uml" data-type="xref" data-xrefstyle="select:labelnumber">#collections_uml</a>] foram atualizados para incluir a `Collection` ABC, de Python 3.6. |
83 | 83 |
|
84 | 84 | A primeira edição de _Python Fluente_ tinha uma seção encorajando o uso das ABCs `numbers` para goose typing. |
@@ -145,7 +145,7 @@ Também é assim que protocolos são entendidos em Smalltalk, o primeiro ambient |
145 | 145 | Exceto em páginas sobre programação de redes, a maioria dos usos da palavra "protocolo" na documentação de Python se refere a essas interfaces informais. |
146 | 146 |
|
147 | 147 | Agora, com a adoção da https://fpy.li/pep544[PEP 544—Protocols: Structural subtyping (static duck typing)] (EN) no Python 3.8, a palavra "protocolo" ganhou um novo sentido em Python - um sentido próximo, mas diferente. |
148 | | -Como vimos na <<protocols_in_fn>> (<<ch_type_hints_def>>), a PEP 544 nos permite criar subclasses de `typing.Protocol` para definir um ou mais métodos que uma classe deve implementar (ou herdar) para satisfazer um verificador de tipo estático. |
| 148 | +Como vimos na <<protocols_in_fn_sec>> (<<ch_type_hints_def>>), a PEP 544 nos permite criar subclasses de `typing.Protocol` para definir um ou mais métodos que uma classe deve implementar (ou herdar) para satisfazer um verificador de tipo estático. |
149 | 149 |
|
150 | 150 | Quando precisar ser específico, vou adotar os seguintes termos: |
151 | 151 |
|
@@ -946,7 +946,11 @@ em `+__init__+`, `self._balls` armazena `list(iterable)`, e não apenas uma refe |
946 | 946 | Como mencionado na <<defensive_duck_prog_sec>>, isso torna nossa `LottoBlower` flexível, pois o argumento `iterable` pode ser de qualquer tipo iterável. |
947 | 947 | Ao mesmo tempo, garantimos que os itens serão armazenados em uma `list`, da onde podemos `pop` os itens. |
948 | 948 | E mesmo se nós sempre recebêssemos listas no argumento `iterable`, |
949 | | -`list(iterable)` produz uma cópia do argumento, o que é uma boa prática, considerando que vamos remover itens dali, e o cliente pode não estar esperando que a lista passada seja modificada.footnote:[<<defensive_argument>> em <<ch_refs_mut_mem>> foi dedicado à questão de apelidamento que acabamos de evitar aqui.] |
| 949 | +`list(iterable)` produz uma cópia do argumento, o que é uma boa prática, |
| 950 | +considerando que vamos remover itens dali, |
| 951 | +e o cliente pode não estar esperando que a lista passada seja |
| 952 | +modificada.footnote:[<<defensive_argument>> (<<ch_refs_mut_mem>>) |
| 953 | +trata da questão de apelidamento que acabamos de evitar aqui.] |
950 | 954 |
|
951 | 955 | Chegamos agora à característica dinâmica crucial da goose typing: |
952 | 956 | declarar subclasses virtuais com o método `register`((("", startref="GTsubclass13")))((("", startref="ABCsubclass13")))((("", startref="IASsubclass13"))) |
@@ -1148,7 +1152,7 @@ Claro, o seu `+__subclasshook__+` poderia também verificar assinaturas de méto |
1148 | 1152 | [NOTE] |
1149 | 1153 | ==== |
1150 | 1154 | Vimos algo sobre protocolos estáticos((("protocols", "static protocols", id="Pstatic13"))) |
1151 | | -em <<protocols_in_fn>> (<<ch_type_hints_def>>). |
| 1155 | +em <<protocols_in_fn_sec>> (<<ch_type_hints_def>>). |
1152 | 1156 | Até considerei deixar toda a discussão sobre protocolos para esse capítulo, |
1153 | 1157 | mas decidi que a apresentação inicial de dicas de tipo em funções precisava incluir protocolos, pois o duck typing é uma parte essencial de Python, |
1154 | 1158 | e checagem de tipos estática sem protocolos não consegue lidar muito bem com as APIs pythônicas. |
@@ -1799,7 +1803,7 @@ que então implementamos da forma tradicional, criando subclasses, e por regist |
1799 | 1803 | Finalizamos aquela seção vendo como o método especial `+__subclasshook__+` permite às ABCs suportarem a tipagem estrutural, pelo reconhecimento de classes não-relacionadas, mas que fornecem os métodos que preenchem os requisitos da interface definida na ABC. |
1800 | 1804 |
|
1801 | 1805 | A última grande seção foi a <<static_protocols_sec>>, |
1802 | | -onde retomamos o estudo do duck typing estático, que havia começado no <<ch_type_hints_def>>, em <<protocols_in_fn>>. |
| 1806 | +onde retomamos o estudo do duck typing estático, que havia começado no <<ch_type_hints_def>>, em <<protocols_in_fn_sec>>. |
1803 | 1807 | Vimos como o decorador `@runtime_checkable` também aproveita o `+__subclasshook__+` para suportar tipagem estrutural durante a execução - mesmo que o melhor uso dos protocolos estáticos seja com checadores de tipos estáticos, |
1804 | 1808 | que podem levar em consideração as dicas de tipo, tornando a tipagem estrutural mais confiável. |
1805 | 1809 | Então falamos sobre o projeto e a codificação de um protocolo estático e como estendê-lo. |
@@ -1864,8 +1868,9 @@ Ele também esta disponível na web, no excelente site do Doug https://fpy.li/13 |
1864 | 1868 | Hellmann também usa a declaração de ABC no estilo antigo:`PluginBase(metaclass=abc.ABCMeta)` em vez do mais simples `PluginBase(abc.ABC)`, disponível desde Python 3.4. |
1865 | 1869 |
|
1866 | 1870 | Quando usamos ABCs, herança múltipla não é apenas comum mas praticamente inevitável, |
1867 | | -porque cada uma das ABCs fundamentais de coleções — `Sequence`, `Mapping`, e `Set`— estendem `Collection`, que por sua vez estende múltiplas ABCs |
1868 | | -(veja <<collections_uml>>). Assim, <<ch_inheritance>> é um tópico importante complementar a esse. |
| 1871 | +porque cada uma das ABCs fundamentais de coleções (`Sequence`, `Mapping`, `Set`) |
| 1872 | +estendem `Collection`, que por sua vez estende múltiplas ABCs |
| 1873 | +(veja <<collections_uml>>). Assim, o <<ch_inheritance>> é um complemento importante ao presente capítulo. |
1869 | 1874 |
|
1870 | 1875 | A https://fpy.li/13-52[PEP 3119--Introducing Abstract Base Classes] (EN) |
1871 | 1876 | apresenta a justificativa para as ABCs. A https://fpy.li/13-53[PEP 3141--A Type Hierarchy for Numbers] (EN) |
|
0 commit comments