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
Métodos:: Funções definidas no corpo de uma classe.
289
289
290
290
Classes:: Quando((("classes", "as callable objects"))) invocada, uma classe executa seu método
291
-
`+__new__+` para criar uma instância, e a seguir `+__init__+`, para inicializá-la. Então a instância é devolvida ao usuário. Como não existe um operador `new` no Python, invocar uma classe é como invocar uma função.footnote:[Invocar uma classe normalmente cria uma instância daquela mesma classe, mas outros comportamentos são possíveis, sobrepondo o `+__new__+`. Veremos um exemplo disso na <<flexible_new_sec>>.]
291
+
`+__new__+` para criar uma instância, e a seguir `+__init__+`, para inicializá-la. Então a instância é devolvida ao usuário. Como não existe um operador `new` no Python, invocar uma classe é como invocar uma função.footnote:[Invocar uma classe normalmente cria uma instância daquela mesma classe, mas outros comportamentos são possíveis, sobrescrevendo o `+__new__+`. Veremos um exemplo disso na <<flexible_new_sec>>.]
292
292
293
293
Instâncias de classe:: Se uma classe define um método `+__call__+`, suas instâncias podem então ser invocadas como funções—esse é o assunto da próxima seção.
Para começar a verificação de tipo, rodamos o comando `mypy` passando o módulo _messages.py_ como parâmetro:
126
+
Para começar a checagem de tipos, rodamos o comando `mypy` passando o módulo _messages.py_ como parâmetro:
127
127
128
128
[source]
129
129
----
@@ -411,7 +411,7 @@ Mas no corpo da função, o verificador considera a chamada `birdie.quack()` ile
411
411
Não interessa que o argumento real, durante a execução, é um `Duck`, porque a tipagem nominal é aplicada de forma estática. O verificador de tipo não executa qualquer pedaço do programa, ele apenas lê o código-fonte.
412
412
Isso é mais rígido que _duck typing_, com a vantagem de capturar alguns bugs durante o desenvolvimento, ou mesmo em tempo real, enquanto o código está sendo digitado em um IDE.
413
413
414
-
O <<birds_module_ex>> é um exemplo bobo que contrapõe duck typing e tipagem nominal, bem como verificação de tipo estática e comportamento durante a execução.footnote:[Muitas vezes a herança é sobreutilizada e difícil de justificar em exemplos que, apesar de realistas, são muito simples. Então por favor aceite esse exemplo com animais como uma rápida ilustração de sub-tipagem.]
414
+
O <<birds_module_ex>> é um exemplo bobo que contrapõe duck typing e tipagem nominal, bem como checagem de tipos estática e comportamento durante a execução.footnote:[Muitas vezes a herança é sobreutilizada e difícil de justificar em exemplos que, apesar de realistas, são muito simples. Então por favor aceite esse exemplo com animais como uma rápida ilustração de sub-tipagem.]
Copy file name to clipboardExpand all lines: capitulos/cap11.adoc
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -790,7 +790,7 @@ Para modificar um atributo de classe, é preciso redefini-lo diretamente na clas
790
790
Porém, no Python, há uma maneira idiomática de obter um efeito mais permanente, e de ser mais explícito sobre a modificação. Como atributos de classe são públicos, eles são herdados por subclasses. Então é uma prática comum fazer a subclasse customizar um atributo da classe. As views baseadas em classes do Django usam amplamente essa técnica. O <<typecode_subclass_demo>> mostra como se faz.
791
791
792
792
[[typecode_subclass_demo]]
793
-
.O `ShortVector2d` é uma subclasse de `Vector2d`, que apenas sobrepõe o `typecode` default
793
+
.O `ShortVector2d` é uma subclasse de `Vector2d`, que apenas sobrescreve o `typecode` default
Copy file name to clipboardExpand all lines: capitulos/cap12.adoc
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -771,7 +771,7 @@ Protocolos como interfaces informais
771
771
772
772
Protocolos((("Soapbox sidebars", "protocols as informal interfaces")))((("sequences, special methods for", "Soapbox discussion", id="SSMsoap12")))((("protocols", "as informal interfaces", secondary-sortas="informal interfaces")))((("interfaces", "protocols as informal"))) não são uma invenção de Python. Os criadores de Smalltalk, que também cunharam a expressão "orientado a objetos", usavam "protocolo" como um sinônimo para aquilo que hoje chamamos de interfaces. Alguns ambientes de programação Smalltalk permitiam que os programadores marcassem um grupo de métodos como um protocolo, mas isso era meramente um artefato de documentação e navegação, e não era imposto pela linguagem. Por isso acredito que "interface informal" é uma explicação curta razoável para "protocolo" quando falo para uma audiência mais familiar com interfaces formais (e impostas pelo compilador).
773
773
774
-
Protocolos bem estabelecidos ou consagrados evoluem naturalmente em qualquer linguagem que usa tipagem dinâmica (isto é, quando a verificação de tipo acontece durante a execução), porque não há informação estática de tipo em assinaturas de métodos e em variáveis. Ruby é outra importante linguagem orientada a objetos que tem tipagem dinâmica e usa protocolos.
774
+
Protocolos bem estabelecidos ou consagrados evoluem naturalmente em qualquer linguagem que usa tipagem dinâmica (isto é, quando a checagem de tipos acontece durante a execução), porque não há informação estática de tipo em assinaturas de métodos e em variáveis. Ruby é outra importante linguagem orientada a objetos que tem tipagem dinâmica e usa protocolos.
775
775
776
776
Na documentação de Python, muitas vezes podemos perceber que um protocolo está sendo discutido pelo uso de linguagem como "um objeto similar a um arquivo". Isso é uma forma abreviada de dizer "algo que se comporta como um arquivo, implementando as partes da interface de arquivo relevantes ao contexto".
Copy file name to clipboardExpand all lines: capitulos/cap13.adoc
+13-13Lines changed: 13 additions & 13 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -56,7 +56,7 @@ Não faz sentido descartar qualquer uma delas.
56
56
57
57
[[type_systems_described]]
58
58
.A metade superior descreve abordagens de checagem de tipo durante a execução usando apenas o interpretador Python; a metade inferior requer um verificador de tipo estático externo, como o Mypy ou um IDE como o PyCharm. Os quadrantes da esquerda se referem a tipagem baseada na estrutura do objeto - isto é, dos métodos oferecidos pelo objeto, independente do nome de sua classe ou superclasses; os quadrantes da direita dependem dos objetos terem tipos explicitamente nomeados: o nome da classe do objeto, ou o nome de suas superclasses.
59
-
image::images/flpy_1301.png[Quatro abordagens para verificação de tipo]
59
+
image::images/flpy_1301.png[Quatro abordagens para checagem de tipos]
60
60
61
61
Cada uma dessas quatro abordagens dependem de interfaces para funcionarem,
62
62
mas a tipagem estática pode ser implementada de forma limitada usando apenas tipos concretos em vez de abstrações de interfaces como protocolos e classes base abstratas.
@@ -679,7 +679,7 @@ Observe que iterator é subclasse de `Iterable`. Discutimos melhor isso adiante,
679
679
680
680
`Callable`, `Hashable`::
681
681
Essas não são coleções, mas `collections.abc` foi o primeiro pacote a definir ABCs na biblioteca padrão, e essas duas foram consideradas importante o suficiente para [.keep-together]#serem# incluídas.
682
-
Elas suportam a verificação de tipo de objetos que precisam ser "chamáveis" ou [.keep-together]#hashable#.
682
+
Elas suportam a checagem de tipos de objetos que precisam ser "chamáveis" ou [.keep-together]#hashable#.
683
683
684
684
Para a detecção de 'callable', a função nativa `callable(obj)` é mais conveniente que `insinstance(obj, Callable)`.
Até considerei deixar toda a discussão sobre protocolos para esse capítulo,
1148
1148
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,
1149
-
e verificação de tipo estática sem protocolos não consegue lidar muito bem com as APIs pythônicas.
1149
+
e checagem de tipos estática sem protocolos não consegue lidar muito bem com as APIs pythônicas.
1150
1150
====
1151
1151
1152
1152
Vamos encerrar esse capítulo ilustrando os protocolos estáticos com dois exemplos simples, e uma discussão sobre as ABCs numéricas e protocolos.
@@ -1324,7 +1324,7 @@ então o Mypy pode inferir que dentro do bloco `if`, o tipo do objeto `o` é _co
1324
1324
[[duck_typing_friend_box]]
1325
1325
.O Duck Typing É Seu Amigo
1326
1326
****
1327
-
Durante((("duck typing"))) a execução, muitas vezes o duck typing é a melhor abordagem para verificação de tipo:
1327
+
Durante((("duck typing"))) a execução, muitas vezes o duck typing é a melhor abordagem para checagem de tipos:
1328
1328
em vez de chamar `isinstance` ou `hasattr`, apenas tente realizar as operações que você precisa com o objeto, e trate as exceções conforme necessário. Aqui está um exemplo concreto:
1329
1329
1330
1330
Continuando a discussão anterior: dado um objeto `o` que eu preciso usar como número complexo,
@@ -1438,9 +1438,9 @@ O problema específico com o tipo `complex` foi resolvido no Python 3.10.0b4, co
1438
1438
Mas o problema geral persiste:
1439
1439
Verificações com `isinstance`/`issubclass` só olham para a presença ou ausência de métodos,
1440
1440
sem checar sequer suas assinaturas, muito menos suas anotações de tipo.
1441
-
E isso não vai mudar tão cedo, porque este tipo de verificação de tipo durante a execução traria um custo de processamento inaceitável.footnote:[Agradeço a Ivan Levkivskyi,
1441
+
E isso não vai mudar tão cedo, porque este tipo de checagem de tipos durante a execução traria um custo de processamento inaceitável.footnote:[Agradeço a Ivan Levkivskyi,
1442
1442
co-autor da https://fpy.li/pep544[PEP 544] (sobre Protocolos),
1443
-
por apontar que checagem de tipo não é apenas uma questão de verificar se o tipo de `x` é `T`: é sobre determinar que o tipo de `x` é _consistente-com_ `T`, o que pode ser caro. Não é de se espantar que o Mypy leve alguns segundos para fazer uma verificação de tipo, mesmo em scripts Python curtos.]
1443
+
por apontar que checagem de tipo não é apenas uma questão de verificar se o tipo de `x` é `T`: é sobre determinar que o tipo de `x` é _consistente-com_ `T`, o que pode ser caro. Não é de se espantar que o Mypy leve alguns segundos para fazer uma checagem de tipos, mesmo em scripts Python curtos.]
1444
1444
====
1445
1445
1446
1446
Agora veremos como implementar um protocolo estático em uma classe definida pelo usuário.
@@ -1484,7 +1484,7 @@ True
1484
1484
Vector2d(3.0, 4.0)
1485
1485
----
1486
1486
1487
-
Para verificação de tipo durante a execução, o <<ex_vector2d_complex_v4>> serve bem,
1487
+
Para checagem de tipos durante a execução, o <<ex_vector2d_complex_v4>> serve bem,
1488
1488
mas para uma cobertura estática e relatório de erros melhores com o Mypy, os métodos
1489
1489
`+__abs__+`, `+__complex__+`, e `fromcomplex` deveriam receber dicas de tipo, como mostrado no <<ex_vector2d_complex_v5>>.
1490
1490
@@ -1652,7 +1652,7 @@ Para encerrar o capítulo, vamos olhar as ABCs numéricas e sua possível substi
1652
1652
[[numbers_abc_proto_sec]]
1653
1653
==== As ABCs em numbers e os novos protocolos numéricos
1654
1654
1655
-
Como((("static protocols", "numbers ABCS and numeric protocols", id="SPnumbers13")))((("numbers ABCs", id="number13")))((("numeric protocols", id="numpro13")))((("protocols", "numeric", id="Pnum13"))) vimos em <<numeric_tower_warning>>, as ABCs no pacote `numbers` da biblioteca padrão funcionam bem para verificação de tipo durante a execução.
1655
+
Como((("static protocols", "numbers ABCS and numeric protocols", id="SPnumbers13")))((("numbers ABCs", id="number13")))((("numeric protocols", id="numpro13")))((("protocols", "numeric", id="Pnum13"))) vimos em <<numeric_tower_warning>>, as ABCs no pacote `numbers` da biblioteca padrão funcionam bem para checagem de tipos durante a execução.
1656
1656
1657
1657
Se você precisa verificar um inteiro, pode usar `isinstance(x, numbers.Integral)` para aceitar `int`, `bool` (que é subclasse de `int`) ou outros tipos inteiros oferecidos por bibliotecas externas que registram seus tipos como subclasses virtuais das ABCs de `numbers`.
1658
1658
Por exemplo, o NumPy tem https://fpy.li/13-39[21 tipos inteiros] — bem como várias variações de tipos de ponto flutuante registrados como `numbers.Real`, e números complexos com várias amplitudes de bits, registrados como `numbers.Complex`.
@@ -1748,7 +1748,7 @@ No momento em que escrevo isso, o NumPy não tem dicas de tipo, então seus tipo
1748
1748
Por outro lado, o Mypy de alguma maneira "sabe" que o `int` e o `float` embutidos podem ser convertidos para `complex`,
1749
1749
apesar de, no _typeshed_, apenas a classe embutida `complex` ter o método `+__complex__+`.footnote:[Isso é uma mentira bem intencionada da parte do typeshed: a partir de Python 3.9, o tipo embutido `complex` na verdade não tem mais um método `+__complex__+`.]
1750
1750
1751
-
Concluindo, apesar((("numeric types", "checking for convertibility"))) da impressão que a verificação de tipo para tipos numéricos não deveria ser difícil,
1751
+
Concluindo, apesar((("numeric types", "checking for convertibility"))) da impressão que a checagem de tipos para tipos numéricos não deveria ser difícil,
1752
1752
a situação atual é a seguinte:
1753
1753
as dicas de tipo da PEP 484
1754
1754
https://fpy.li/cardxvi[evitam] (EN) a torre numérica
@@ -1764,8 +1764,8 @@ Se você não usa números complexos, pode confiar naqueles protocolos em vez da
1764
1764
1765
1765
As principais lições dessa seção são:
1766
1766
1767
-
* As ABCs de `numbers` são boas para verificação de tipo durante a execução, mas inadequadas para tipagem estática.
1768
-
* Os protocolos numéricos estáticos `SupportsComplex`, `SupportsFloat`, etc. funcionam bem para tipagem estática, mas são pouco confiáveis para verificação de tipo durante a execução se números complexos estiverem envolvidos.
1767
+
* As ABCs de `numbers` são boas para checagem de tipos durante a execução, mas inadequadas para tipagem estática.
1768
+
* Os protocolos numéricos estáticos `SupportsComplex`, `SupportsFloat`, etc. funcionam bem para tipagem estática, mas são pouco confiáveis para checagem de tipos durante a execução se números complexos estiverem envolvidos.
1769
1769
1770
1770
Estamos agora prontos para uma rápida revisão do que vimos nesse capítulo.((("", startref="Pstatic13")))((("", startref="Pnum13")))((("", startref="numpro13")))((("", startref="number13")))((("", startref="SPnumbers13")))
1771
1771
@@ -1924,8 +1924,8 @@ A <<type_systems_languages>> é((("Soapbox sidebars", "typing map")))((("typing
1924
1924
com os nomes de algumas linguagem populares que suportam cada um dos modos de tipagem.
1925
1925
1926
1926
[[type_systems_languages]]
1927
-
.Quatro abordagens para verificação de tipo e algumas linguagens que as usam.
1928
-
image::images/flpy_1308.png[Quatro abordagens para verificação de tipo e algumas linguagens que as usam.]
1927
+
.Quatro abordagens para checagem de tipos e algumas linguagens que as usam.
1928
+
image::images/flpy_1308.png[Quatro abordagens para checagem de tipos e algumas linguagens que as usam.]
1929
1929
1930
1930
TypeScript e Python ≥ 3.8 são as únicas linguagem em minha pequena e arbitrária amostra que suportam todas as quatro abordagens.
0 commit comments