Skip to content

Commit 1cc447d

Browse files
committed
desatando "nós"
1 parent 79b5f39 commit 1cc447d

File tree

13 files changed

+69
-39
lines changed

13 files changed

+69
-39
lines changed

capitulos/cap05.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ Entretanto, `TypedDict` não cria classes concretas que possam ser instanciadas.
3939
Ela é apenas a sintaxe para escrever dicas de tipo para parâmetros de função e
4040
variáveis que aceitarão valores de mapeamentos como registros,
4141
enquanto suas chaves serão os nomes dos campos.
42-
Nós veremos mais sobre isso na <<typeddict_sec>> do <<ch_more_types>>.
42+
Veremos mais sobre isso na <<typeddict_sec>> do <<ch_more_types>>.
4343
====
4444

4545

capitulos/cap06.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ mas outro interpretador Python pode retornar algo diferente.
256256
O ponto fundamental é que o ID será sempre um valor numérico único,
257257
e ele nunca mudará durante a vida do objeto.
258258

259-
Na prática, nós raramente usamos a função `id()` quando programamos.
259+
Na prática, raramente usamos a função `id()` quando programamos.
260260
A verificação de identidade é feita, na maior parte das vezes, com o operador `is`,
261261
que compara os IDs dos objetos, então nosso código não precisa chamar `id()`
262262
explicitamente.
@@ -818,7 +818,7 @@ include::code/06-obj-ref/twilight_bus.py[tags=TWILIGHT_BUS_CLASS]
818818
----
819819
====
820820
[role="pagebreak-before less_space"]
821-
<1> Aqui nós cuidadosamente criamos uma lista vazia quando `passengers` é `None`.
821+
<1> Aqui cuidadosamente criamos uma lista vazia quando `passengers` é `None`.
822822
<2> Entretanto, esta atribuição transforma `self.passengers` em um apelido para `passengers`,
823823
que por sua vez é um apelido para o argumento passado para `+__init__+`
824824
(i.e. `basketball_team` em <<demo_twilight_bus>>).

capitulos/cap08.adoc

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ Por exemplo, não é possível, usando dicas de tipo,
449449
definir `Quantity` como um número inteiro entre 1 e 10000,
450450
ou `AirportCode` como uma sequência de 3 letras.
451451
O NumPy oferece `uint8`, `int16`, e outros tipos numéricos ligados à arquitetura do hardware,
452-
mas na biblioteca padrão de Python nós encontramos apenas
452+
mas na biblioteca padrão de Python encontramos apenas
453453
tipos com conjuntos muitos pequenos de valores (`NoneType`, `bool`)
454454
ou conjuntos muito grandes (`float`, `int`, `str`, todas as tuplas possíveis, etc.).]
455455

@@ -876,20 +876,27 @@ Todo sistema de tipagem gradual precisa de um tipo coringa como `Any`
876876
O verbo "inferir" é um sinônimo bonito para "adivinhar", quando usado no contexto da análise de tipos.
877877
Verificadores de tipo modernos, em Python e outras linguagens,
878878
não precisam de anotações de tipo em todo lugar porque conseguem inferir o tipo de muitas expressões.
879-
Por exemplo, se eu escrever `x = len(s) * 10`, o verificador não precisa de uma declaração local explícita para saber que `x` é um `int`, desde que consiga encontrar dicas de tipo para `len` em algum lugar.
879+
Por exemplo, se eu escrever `x = len(s) * 10`,
880+
o verificador não precisa de uma declaração local explícita para saber que `x` é um `int`,
881+
desde que consiga encontrar dicas de tipo para `len` em algum lugar.
880882
====
881883

882-
Agora podemos explorar o restante dos tipos usados em anotações.((("", startref="GTSsub08")))((("", startref="dynamic08")))((("", startref="anytype08")))
884+
Agora podemos explorar o restante dos tipos usados em anotações.
885+
((("", startref="GTSsub08")))((("", startref="dynamic08")))((("", startref="anytype08")))
883886

884887
==== Tipos simples e classes
885888

886-
Tipos simples((("gradual type system", "simple types and classes"))) como `int`, `float`, `str`, e `bytes` podem ser usados diretamente em dicas de tipo.
887-
Classes concretas da biblioteca padrão, de pacotes externos ou definidas pelo usuário — `FrenchDeck`, `Vector2d`, e `Duck` - também podem ser usadas em dicas de tipo.
889+
Tipos simples((("gradual type system", "simple types and classes")))
890+
como `int`, `float`, `str`, e `bytes` podem ser usados diretamente em dicas de tipo.
891+
Classes concretas da biblioteca padrão,
892+
de pacotes externos ou definidas pelo usuário (ex. `FrenchDeck`, `Vector2d`, e `Duck`)
893+
também podem ser usadas em dicas de tipo.
888894

889895
Classes base abstratas também são úteis aqui.
890896
Voltaremos a elas quando formos estudar os tipos coleção, e em <<type_hint_abc_sec>>.
891897

892-
Para classes, _consistente-com_ é definido como _subtipo_de_: uma subclasse é _consistente-com_ todas as suas superclasses.
898+
Para classes, _consistente-com_ é definido como _subtipo_de_:
899+
uma subclasse é _consistente-com_ todas as suas superclasses.
893900

894901
Entretanto, "a praticidade se sobrepõe à pureza", então há uma exceção importante, discutida em seguida.
895902

@@ -901,15 +908,17 @@ Não há nenhuma relação nominal de subtipo entre os tipo nativos `int`, `floa
901908
Mas a PEP 484 https://fpy.li/cardxvi[declara]
902909
que `int` é _consistente-com_ `float`, e `float` é _consistente-com_ `complex`.
903910
Na prática, faz sentido:
904-
`int` implementa todas as operações que `float` implementa, e `int` implementa operações adicionais também - operações binárias como `&`, `|`, `<<`, etc.
911+
`int` implementa todas as operações que `float` implementa, e `int` implementa operações adicionais tambémoperações binárias como `&`, `|`, `<<`, etc.
905912
O resultado final é o seguinte: `int` é _consistente-com_ `complex`.
906913
Para `i = 3`, `i.real` é `3` e `i.imag` é `0`.
907914
====
908915

909916

910917
==== Os tipos Optional e Union
911918

912-
Nós((("gradual type system", "Optional and Union types")))((("Union type")))((("Optional type"))) vimos o tipo especial `Optional` em <<dealing_with_none_sec>>. Ele resolve o problema de ter `None` como default, como no exemplo daquela seção:
919+
Vimos((("gradual type system", "Optional and Union types")))((("Union type")))((("Optional type")))
920+
o tipo especial `Optional` em <<dealing_with_none_sec>>.
921+
Ele resolve o problema de ter `None` como default, como no exemplo daquela seção:
913922

914923
[source, py]
915924
----
@@ -1730,7 +1739,7 @@ include::code/08-def-type-hints/comparable/comparable.py[]
17301739

17311740
Um tipo `T` é _consistente-com_ um protocolo `P` se `T` implementa todos os métodos definido em `P`, com assinaturas de tipo correspondentes.
17321741

1733-
Dado `SupportsLessThan`, nós agora podemos definir essa versão funcional de `top` no <<top_protocol_ex>>.
1742+
Dado `SupportsLessThan`, agora podemos definir essa versão funcional de `top` no <<top_protocol_ex>>.
17341743

17351744
[[top_protocol_ex]]
17361745
._top.py_: definição da função `top` usando uma `TypeVar` com `bound=SupportsLessThan`
@@ -2252,16 +2261,22 @@ Esse é um custo unitário.
22522261
22532262
Mas há também um custo recorrente, eterno.
22542263
2255-
Nós perdemos um pouco do poder expressivo de Python se insistimos que tudo precisa estar sob a checagem de tipos.
2256-
Recursos maravilhosos como desempacotamento de argumentos — e.g., `config(**settings)`— estão além da capacidade de compreensão dos checadores de tipos.
2264+
Perdemos parte do poder expressivo de Python se insistimos que tudo precisa estar sob a checagem de tipos.
2265+
Recursos excelentes estão além da capacidade de compreensão dos checadores de tipos,
2266+
por exemplo o desempacotamento de argumentos: `config(**settings)`.
22572267
2258-
Se você quiser ter uma chamada como `config(**settings)` verificada quanto ao tipo, você precisa explicitar cada argumento.
2268+
Se quiser ter uma chamada como `config(**settings)` verificada quanto ao tipo,
2269+
precisa explicitar cada argumento.
22592270
Isso me traz lembranças de programas em Turbo Pascal, que escrevi 35 anos atrás.
22602271
22612272
Bibliotecas que usam metaprogramação são difíceis ou impossíveis de anotar.
2262-
Claro que a metaprogramação pode ser mal usada, mas isso também é algo que torna muitos pacotes de Python divertidos [.keep-together]#de usar#.
2273+
Claro que a metaprogramação pode ser mal usada,
2274+
mas isso também é algo que torna muitos pacotes de Python divertidos de usar.
22632275
2264-
Se dicas de tipo se tornarem obrigatórias sem exceções, por uma decisão superior em grande empresas, aposto que logo veremos pessoas usando geração de código para reduzir linhas de código padrão em programas Python - uma prática comum com linguagens menos dinâmicas.
2276+
Se dicas de tipo se tornarem obrigatórias sem exceções,
2277+
por uma decisão superior em grande empresas,
2278+
aposto que logo veremos pessoas usando geração de código para reduzir a verbosidade em programas Python,
2279+
uma prática comum com linguagens menos dinâmicas.
22652280
22662281
Para alguns projetos e contextos, dicas de tipo simplesmente não fazem sentido.
22672282
Mesmo em contextos onde elas fazer muito sentido, não fazem sentido o tempo todo.
@@ -2271,18 +2286,24 @@ Alan Kay, o recipiente do Turing Award que foi um dos pioneiros da programação
22712286
22722287
[quote]
22732288
____
2274-
Algumas pessoas são completamente religiosas no que diz respeito a sistemas de tipo, e como um matemático eu adoro a ideia de sistemas de tipos, mas ninguém até agora inventou um que tenha alcance o suficiente..footnote:[Fonte:
2289+
Algumas pessoas são completamente religiosas no que diz respeito a sistemas de tipo,
2290+
e como um matemático eu adoro a ideia de sistemas de tipos,
2291+
mas ninguém até agora inventou um que tenha alcance o suficiente.footnote:[Fonte:
22752292
https://fpy.li/8-54["A Conversation with Alan Kay"].]
22762293
____
22772294
22782295
Obrigado, Guido, pela tipagem opcional.
2279-
Vamos usá-la como foi pensada, e não tentar anotar tudo em conformidade estrita com um estilo de programação que se parece com Java 1.5.((("", startref="SStypehints08")))
2296+
Vamos usá-la como foi pensada, e não tentar anotar tudo em conformidade estrita com
2297+
um estilo de programação que se parece com Java 1.5.((("", startref="SStypehints08")))
22802298
22812299
22822300
[role="soapbox-title"]
22832301
Duck Typing FTW
22842302
2285-
Duck typing((("Soapbox sidebars", "duck typing")))((("duck typing"))) encaixa bem no meu cérebro, e duck typing estático é um bom compromisso, permitindo checagem estática de tipo sem perder muito da flexibilidade que alguns sistemas de tipagem nominal só permitem ao custo de muita complexidade - isso quando permitem.
2303+
Duck typing((("Soapbox sidebars", "duck typing")))((("duck typing")))
2304+
encaixa bem no meu cérebro, e duck typing estático é um bom compromisso,
2305+
permitindo checagem estática de tipo sem perder muito da flexibilidade que
2306+
alguns sistemas de tipagem nominal só permitem ao custo de muita complexidade - isso quando permitem.
22862307
22872308
Antes da PEP 544, toda essa ideia de dicas de tipo me parecia completamente não-pythônica,
22882309
Fiquei muito feliz quando vi `typing.Protocol` surgir em Python.
@@ -2291,7 +2312,9 @@ Ele traz equilíbrio para a Força.
22912312
[role="soapbox-title"]
22922313
Genéricos ou Específicos?
22932314
2294-
De((("Soapbox sidebars", "generic collections")))((("generic collections", "Soapbox discussion"))) uma perspectiva de Python, o uso do termo "genérico" na tipagem é um retrocesso.
2315+
De((("Soapbox sidebars", "generic collections")))((("generic collections",
2316+
"Soapbox discussion"))) uma perspectiva de Python,
2317+
o uso do termo "genérico" na tipagem é um retrocesso.
22952318
Os sentidos comuns do termo "genérico" são "aplicável integralmente a um grupo ou uma classe" ou "sem uma marca distintiva."
22962319
22972320
Considere `list` versus `list[str]`. o primeiro é genérico: aceita qualquer objeto.

capitulos/cap11.adoc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,7 @@ Quando suportamos a conversão para `bytes`, também implementamos um construtor
852852

853853
Vimos que a https://docs.python.org/pt-br/3/library/string.html#formatspec[Mini-Linguagem de Especificação de Formato] é extensível, ao implementarmos um método `+__format__+` que analisa uma `format_spec` fornecida à função embutida `format(obj, format_spec)` ou dentro de campos de substituição `'{:«format_spec»}'` em f-strings ou ainda strings usadas com o método `str.format()`.
854854

855-
Para preparar a transformação de instâncias de `Vector2d` em _hashable_, fizemos um esforço para torná-las imutáveis, ao menos prevenindo modificações acidentais, programando os atributos `x` e `y` como privados, e expondo-os como propriedades apenas para leitura. Nós então implementamos
855+
Para preparar a transformação de instâncias de `Vector2d` em _hashable_, fizemos um esforço para torná-las imutáveis, ao menos prevenindo modificações acidentais, programando os atributos `x` e `y` como privados, e expondo-os como propriedades apenas para leitura. Então implementamos
856856
`+__hash__+` usando a técnica recomendada, aplicar o operador xor aos _hashes_ dos atributos da instância.
857857

858858
Discutimos a seguir a economia de memória e as ressalvas de se declarar um atributo `+__slots__+` em `Vector2d`. Como o uso de `+__slots__+` tem efeitos colaterais, ele só faz real sentido quando é preciso processar um número muito grande de instâncias—pense em milhões de instâncias, não apenas milhares. Em muitos destes casos, usar a https://fpy.li/pandas[pandas] pode ser a melhor opção.
@@ -911,7 +911,11 @@ Nas((("attributes", "properties and up-front costs")))((("Pythonic objects", "So
911911
912912
Quando sentimos a necessidade de evitar modificações acidentais dos atributos `x` e `y`, implementamos propriedades, mas nada mudou no restante do código ou na interface pública de `Vector2d`, como se verifica através dos doctests. Continuamos podendo acessar `my_vector.x` and `my_vector.y`.
913913
914-
Isso mostra que podemos sempre iniciar o desenvolvimento de nossas classes da maneira mais simples possível, com atributos públicos, pois quando (ou se) nós mais tarde precisarmos impor mais controle, com _getters_ e _setters_, estes métodos podem ser implementados usando propriedades, sem mudar nada no código que já interage com nossos objetos através dos nomes que eram, inicialmente, simples atributos públicos (`x` e `y`, por exemplo).
914+
Isso mostra que podemos sempre iniciar o desenvolvimento de nossas classes da maneira mais simples possível,
915+
com atributos públicos, pois quando (ou se) for preciso impor mais depois, com _getters_ e _setters_,
916+
estes métodos podem ser implementados usando propriedades,
917+
sem mudar nada no código que já interage com nossos objetos através dos nomes que eram,
918+
inicialmente, simples atributos públicos (`x` e `y`, por exemplo).
915919
916920
Essa abordagem é o oposto daquilo que é encorajado pela linguagem Java: um programador Java não pode começar com atributos públicos simples e apenas mais tarde, se necessário, implementar propriedades, porque elas não existem naquela linguagem. Portanto, escrever _getters_ e _setters_ é a regra em Java—mesmo quando esses métodos não fazem nada de útil—porque a API não pode evoluir de atributos públicos simples para _getters_ e _setters_ sem quebrar todo o código que já use aqueles atributos.
917921

capitulos/cap12.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ Vamos((("Vector class, multidimensional", "&#x005F;&#x005F;hash&#x005F;&#x005F;
436436
Juntamente com o `+__eq__+` existente, isso tornará as instâncias de `Vector` _hashable_.
437437

438438
O `+__hash__+` do `Vector2d` (no <<ex_vector2d_v3_hash>>) computava o _hash_ de uma `tuple` construída com os dois componentes, `self.x` and `self.y`.
439-
Nós agora podemos estar lidando com milhares de componentes, então criar uma `tuple` pode ser caro demais. Em vez disso, vou aplicar sucessivamente o operador `^` (xor) aos _hashes_ de todos os componentes, assim: `v[0] ^ v[1] ^ v[2]`. É para isso que serve a função `functools.reduce`. Anteriormente afirmei que `reduce` não é mais tão popular quanto antes,footnote:[`sum`, `any`, e `all` cobrem a maioria dos casos de uso comuns de `reduce`. Veja a discussão na <<map_filter_reduce>>.] mas computar o _hash_ de todos os componentes do vetor é um bom caso de uso para ela. A <<reduce_fig>> ilustra a ideia geral da((("reducing functions"))) função `reduce`.
439+
Agora podemos estar lidando com milhares de componentes, então criar uma `tuple` pode ser caro demais. Em vez disso, vou aplicar sucessivamente o operador `^` (xor) aos _hashes_ de todos os componentes, assim: `v[0] ^ v[1] ^ v[2]`. É para isso que serve a função `functools.reduce`. Anteriormente afirmei que `reduce` não é mais tão popular quanto antes,footnote:[`sum`, `any`, e `all` cobrem a maioria dos casos de uso comuns de `reduce`. Veja a discussão na <<map_filter_reduce>>.] mas computar o _hash_ de todos os componentes do vetor é um bom caso de uso para ela. A <<reduce_fig>> ilustra a ideia geral da((("reducing functions"))) função `reduce`.
440440

441441
////
442442
PROD: unexpected indent in first line after page break
@@ -635,7 +635,7 @@ Ter um loop `for` que itera sobre itens sem perder tempo com variáveis de índi
635635
----
636636
====
637637
<1> `zip` devolve um gerador que produz tuplas sob demanda.
638-
<2> Cria uma `list` apenas para exibição; nós normalmente iteramos sobre o gerador.
638+
<2> Cria uma `list` apenas para exibição; normalmente iteramos sobre o gerador.
639639
<3> `zip` para sem aviso quando um dos iteráveis é exaurido.
640640
<4> A função `itertools.zip_longest` se comporta de forma diferente: ela usa um `fillvalue` opcional (por default `None`) para preencher os valores ausentes, e assim consegue gerar tuplas até que o último iterável seja exaurido.
641641

0 commit comments

Comments
 (0)