Skip to content

Commit 282d873

Browse files
committed
formatação
1 parent 0338ed9 commit 282d873

File tree

10 files changed

+266
-237
lines changed

10 files changed

+266
-237
lines changed

vol1/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
*.pdf
1+
vol1.pdf

vol1/cap03.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ A <<mapping_methods_tbl>> mostra os métodos implementados por `dict` e pelas va
438438
| `d.pop(k, [default])` | ● | ● | ● | Remove e devolve valor em `k`, ou `default` ou `None`, se `k` não existir
439439
| `d.popitem()` | ● | ● | ● | Remove e devolve, na forma `(chave, valor)`, o último item inseridofootnote:[`OrderedDict.popitem(last=False)` remove o primeiro item inserido (FIFO). O argumento nomeado `last` não é suportado por `dict` ou `defaultdict`, pelo menos até Python 3.10b3.]
440440
| `+d.__reversed__()+` | ● | ● | ● | Suporte a `reverse(d)`—devolve um iterador de chaves, da última para a primeira a serem inseridas
441-
| `+d.__ror__(other)+` | ● | ● | ● | Suporte a `other \| dd`—operador de união reverso (Python ≥ 3.9)footnote:[Operadores reversos são tratados no «Capítulo 16» [.small]#&#91;vol.2, fpy.li/4r&#93;.&#93;#
441+
| `+d.__ror__(other)+` | ● | ● | ● | Suporte a `other \| dd`—operador de união reverso (Python ≥ 3.9)footnote:[Operadores reversos são tratados no «Capítulo 16» [.small]#&#91;vol.2, fpy.li/4r&#93;.&#93;#]
442442
|`d.setdefault(k, [default])` | ● | ● | ● | Se `k in d`, devolve `d[k]`; senão, atribui `d[k] = default` e devolve isso
443443
| `+d.__setitem__(k, v)+` | ● | ● | ● | `d[k] = v`—coloca `v` em `k`
444444
| `d.update(m, [**kwargs])` | ● | ● | ● | Atualiza `d` com itens de um mapeamento ou iterável de pares `(chave, valor)`
@@ -916,7 +916,7 @@ A principal razão pela qual é melhor criar uma subclasse de `UserDict` em vez
916916
que o tipo embutido tem alguns atalhos de implementação,
917917
que acabam nos obrigando a sobrescrever métodos que poderíamos apenas herdar de `UserDict`
918918
sem maiores problemas.footnote:[O problema exato de se criar subclasses de `dict` e de outros tipos embutidos
919-
é tratado na «Seção 14.3» [.small]#&#91;vol.2, fpy.li/4z&#93;.&#93;#
919+
é tratado na «Seção 14.3» [.small]#&#91;vol.2, fpy.li/4z&#93;.&#93;#.]
920920

921921
Observe que `UserDict` não herda de `dict`, mas usa uma composição:
922922
a classe tem uma instância interna de `dict`, chamada `data`, que mantém os itens propriamente ditos.

vol1/cap06.adoc

Lines changed: 55 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ Em 1997, ((("object references", "variables as labels versus boxes", id="ORvar06
6969
"as labels versus boxes", secondary-sortas="labels versus boxes", id="Vlabel06")))
7070
fiz um curso de verão sobre Java no MIT.
7171
A professora Lynn Steinfootnote:[Lynn Andrea Stein é uma aclamada educadora de ciências da computação.
72-
Ela «atualmente leciona na Olin College of Engineering (EN)» [.small]#&#91;fpy.li/6-1&#93;#.]
72+
Ela atualmente leciona no «Olin College of Engineering» [.small]#&#91;fpy.li/6-1&#93;#.]
7373
explicou que a metáfora comum, de “variáveis como caixas”,
7474
na verdade atrapalha o entendimento de variáveis de
7575
referência em linguagens orientadas a objetos.
@@ -258,6 +258,7 @@ mas outro interpretador Python pode retornar algo diferente.
258258
O ponto fundamental é que o ID será sempre um valor numérico único,
259259
e ele nunca mudará durante a vida do objeto.
260260

261+
<<<
261262
Na prática, raramente usamos a função `id()` quando programamos.
262263
A verificação de identidade é feita, na maior parte das vezes, com o operador `is`,
263264
que compara os IDs dos objetos, então nosso código não precisa chamar `id()`
@@ -276,7 +277,7 @@ diferentes--pode não ser viável usar `is`.
276277

277278

278279
[[choosing_eq_v_is_sec]]
279-
==== Escolhendo Entre == e is
280+
==== Escolhendo entre == e is
280281

281282
O operador ((("is operator"))) `==` compara os valores de objetos (os dados que eles contêm),
282283
enquanto `is` compara suas identidades.
@@ -435,14 +436,15 @@ Mas se existirem itens mutáveis, isso pode gerar surpresas desagradáveis.
435436
Em <<ex_shallow_copy>> criamos uma lista contendo outra lista e uma tupla,
436437
e então fazemos algumas mudanças para ver como isso afeta os objetos referenciados.
437438

439+
<<<
438440
[TIP]
439441
====
440-
Se você tem um computador conectado à internet disponível,
441-
recomendo fortemente que você assista à animação interativa do
442-
<<ex_shallow_copy>> em «Online Python Tutor» [.small]#&#91;fpy.li/6-3&#93;#.
442+
Se você está conectado à internet,
443+
recomendo que assista à animação interativa do
444+
<<ex_shallow_copy>> no «_Online Python Tutor_» [.small]#&#91;fpy.li/6-3&#93;#.
443445
No momento em que escrevo, o link direto para um exemplo pronto no _pythontutor.com_
444-
não estava funcionando de forma estável.
445-
Mas a ferramenta é ótima, então vale a pena gastar seu tempo copiando e colando o código.
446+
não funciona sempre.
447+
Mas a ferramenta é ótima, então vale a pena investir o tempo copiando e colando o código.
446448
====
447449

448450

@@ -463,7 +465,7 @@ print('l1:', l1)
463465
print('l2:', l2)
464466
----
465467
====
466-
<1> `l2` é uma cópia rasa de `l1`. Este estado está representado em <<shallow_copy1>>.
468+
<1> `l2` é uma cópia rasa de `l1`. Este estado está representado na <<shallow_copy1>>.
467469
<2> Concatenar `100` a `l1` não tem qualquer efeito sobre `l2`.
468470
<3> Aqui removemos `55` da lista interna `l1[1]`. Isso afeta `l2`,
469471
pois `l2[1]` está associado à mesma lista em `l1[1]`.
@@ -476,15 +478,15 @@ Isso é equivalente a fazer `l2[2] = l2[2] + (10, 11)`.
476478
Agora as tuplas na última posição de `l1` e `l2` não são mais o mesmo objeto.
477479
Veja <<shallow_copy2>>.
478480

481+
A saída do <<ex_shallow_copy>> está no <<ex_shallow_copy_out>>,
482+
e o estado final dos objetos está representado na <<shallow_copy2>>.
483+
479484
[[shallow_copy1]]
480485
.Estado do programa imediatamente após a atribuição `l2 = list(l1)` em <<ex_shallow_copy>>. `l1` e `l2` se referem a listas diferentes, mas as listas compartilham referências para os mesmos objetos internos, a lista `[66, 55, 44]` e para a tupla `(7, 8, 9)`. (Diagrama gerado pelo Online Python Tutor)
481-
image::../images/flpy_0603.png[References diagram]
482-
483-
A saída de <<ex_shallow_copy>> é <<ex_shallow_copy_out>>,
484-
e o estado final dos objetos está representado em <<shallow_copy2>>.
486+
image::../images/flpy_0603.png[align="left",pdfwidth=8cm]
485487

486488
[[ex_shallow_copy_out]]
487-
.Saída de <<ex_shallow_copy>>
489+
.Saída do <<ex_shallow_copy>>
488490
====
489491
[source, python]
490492
----
@@ -497,7 +499,7 @@ l2: [3, [66, 44, 33, 22], (7, 8, 9, 10, 11)]
497499

498500
[[shallow_copy2]]
499501
.Estado final de `l1` e `l2`: elas ainda compartilham referências para o mesmo objeto lista, que agora contém `[66, 44, 33, 22]`, mas a operação `l2[2] += (10, 11)` criou uma nova tupla com conteúdo `(7, 8, 9, 10, 11)`, sem relação com a tupla `(7, 8, 9)` referenciada por `l1[2]`. (Diagrama gerado pelo Online Python Tutor.)
500-
image::../images/flpy_0604.png[References diagram]
502+
image::../images/flpy_0604.png[align="left",pdfwidth=10cm]
501503

502504
Já deve estar claro que cópias rasas são fáceis de criar,
503505
mas podem ou não ser o que você quer.
@@ -726,8 +728,8 @@ True
726728
<7> O problema: `bus2.passengers` e `bus3.passengers` se referem à mesma lista.
727729
<8> Mas `bus1.passengers` é uma lista diferente.
728730

729-
O problema é que instâncias de `HauntedBus` que não recebem uma lista de passageiros
730-
inicial acabam todas compartilhando a mesma lista de passageiros entre si.
731+
O problema é que objetos `HauntedBus` que não recebem uma lista de passageiros
732+
inicial compartilham a mesma lista de passageiros entre si.
731733

732734
Este tipo de bug pode ser muito sutil.
733735
Como o <<demo_haunted_bus>> demonstra,
@@ -740,9 +742,9 @@ quando o módulo é carregado—e os valores default se tornam atributos do obje
740742
Assim, se o valor default é um objeto mutável e você o altera,
741743
a alteração vai afetar todas as futuras chamadas da função.
742744

743-
Após executar as linhas do <<demo_haunted_bus>>,
744-
você pode inspecionar o objeto `+HauntedBus.__init__+`
745-
e ver os estudantes fantasma assombrando o atributo `+__defaults__+`:
745+
Depois de rodar o <<demo_haunted_bus>>,
746+
podemos inspecionar o objeto `+HauntedBus.__init__+`
747+
e ver fantasmas de estudantes assombrando o atributo `+__defaults__+`:
746748

747749
[source, python]
748750
----
@@ -805,16 +807,17 @@ perspectiva de um cliente daquela classe, em <<demo_twilight_bus>>.
805807
<3> O `bus` deixa uma estudante, depois outra.
806808
<4> As passageiras desembarcadas desapareceram do time de basquete!
807809

810+
<<<
808811
`TwilightBus` viola o "Princípio da Menor Surpresa", uma boa prática do design de
809-
interfaces.footnote:[Ver «_Principle of least astonishment_» [.small]#&#91;fpy.li/6-5&#93;# (EN).]
810-
Com certeza, é surpreendente que quando o ônibus deixa uma estudante,
811-
seu nome seja removido da escalação do time de basquete.
812+
interfaces.footnote:[Ver «_Principle of least astonishment_» [.small]#&#91;fpy.li/6-5&#93;#.]
813+
Com certeza, é surpreendente: quando o ônibus deixa uma estudante,
814+
o nome dela é removido da escalação do time de basquete.
812815

813816

814817
<<ex_twilight_bus>> é a implementação de `TwilightBus` e uma explicação do problema.
815818

816819
[[ex_twilight_bus]]
817-
.Uma classe simples mostrando os perigos de mudar argumentos recebidos
820+
.Classe simples mostrando o perigo de mudar argumentos recebidos
818821
====
819822
[source, py]
820823
----
@@ -833,8 +836,9 @@ O problema aqui é que o ônibus está apelidando a lista passada para o constru
833836
Ao invés disso, ele deveria manter sua própria lista de passageiros.
834837
A solução é simples: em `+__init__+`, quando o parâmetro `passengers` é fornecido,
835838
`self.passengers` deveria ser inicializado com uma cópia daquela lista,
836-
como fizemos, de forma correta, em <<ex_bus1>>:
839+
como fizemos, de forma correta, no <<ex_bus1>>:
837840

841+
<<<
838842
[source, python]
839843
----
840844
def __init__(self, passengers=None):
@@ -936,7 +940,7 @@ Outras implementações de Python têm coletores de lixo mais sofisticados,
936940
que não se baseiam na contagem de referências,
937941
o que significa que o método `+__del__+` pode não ser chamado
938942
imediatamente quando não existem mais referências ao objeto.
939-
Veja «PyPy, Garbage Collection, and a Deadlock» [.small]#&#91;fpy.li/6-7&#93;# (EN)
943+
Veja «_PyPy, Garbage Collection, and a Deadlock_» [.small]#&#91;fpy.li/6-7&#93;#
940944
de A. Jesse Jiryu Davis para uma discussão sobre os usos próprios e impróprios de `+__del__+`.
941945

942946
Para demonstrar o fim da vida de um objeto, <<ex_finalize>> usa `weakref.finalize`
@@ -995,18 +999,18 @@ por terem uma referência no cache.((("", startref="ORdel06")))((("", startref="
995999
Referências fracas são um tópico muito especializado,
9961000
então decidi retirá-lo dessa segunda edição.
9971001
Em vez disso, publiquei a nota
998-
«"Weak References" em _fluentpython.com_» [.small]#&#91;fpy.li/weakref&#93;#.
1002+
«_Weak References_ em _fluentpython.com_» [.small]#&#91;fpy.li/weakref&#93;#.
9991003
====
10001004

10011005
=== Peças que Python prega com imutáveis
10021006

10031007
[NOTE]
10041008
====
1005-
Esta((("object references", "immutability and"))) seção opcional discute alguns detalhes que,
1006-
na verdade, não são muito importantes para _usuários_ de Python,
1009+
Esta((("object references", "immutability and"))) seção opcional discute detalhes que
1010+
não são muito importantes para _usuários_ de Python,
10071011
e que podem não se aplicar a outras implementações da linguagem ou mesmo a futuras versões de CPython.
1008-
Entretanto, já vi muita gente tropeçar nesses casos laterais e daí passar a usar o((("is operator")))
1009-
operador `is` de forma incorreta, então acho que vale a pena mencionar esses detalhes.
1012+
Mas já vi pessoas tropeçarem nesses casos obscuros e passarem a usar o((("is operator")))
1013+
operador `is` incorretamente, então decidi abordar esses detalhes.
10101014
====
10111015

10121016
Fiquei((("tuples", "immutability and"))) surpreso ao descobrir que, dada uma tupla `t`,
@@ -1017,7 +1021,7 @@ Digite `help(tuple)` no console de Python e leia:
10171021
"Se o argumento é uma tupla, o valor de retorno é o mesmo objeto."
10181022
Pensei que sabia tudo sobre tuplas antes de escrever esse livro.]
10191023

1020-
<<ex_same_tuple>> demonstra esse fato.
1024+
O <<ex_same_tuple>> demonstra esse fato.
10211025

10221026
[[ex_same_tuple]]
10231027
.Uma tupla construída a partir de outra é, na verdade, exatamente a mesma tupla.
@@ -1148,29 +1152,29 @@ Isso pode ser feito com referências fracas,
11481152
um mecanismo de baixo nível encontrado nas coleções `WeakValueDictionary`,
11491153
`WeakKeyDictionary`, `WeakSet`, e na função `finalize` do módulo `weakref`.
11501154

1151-
Leia «"Weak References" em _fluentpython.com_» [.small]#&#91;fpy.li/weakref&#93;# (EN)
1152-
para aprender mais sobre `weakref`.
1153-
1155+
Leia «_Weak References_» [.small]#&#91;fpy.li/weakref&#93;#
1156+
para aprender mais sobre `weakref` no _fluentpython.com_.
11541157

1158+
<<<
11551159
=== Para saber mais
11561160

1157-
O((("object references", "further reading on")))
1158-
«capítulo "Modelo de Dados"» [.small]#&#91;fpy.li/2j&#93;# de _A Referência da Linguagem Python_
1161+
O((("object references", "further reading on"))) capítulo
1162+
«Modelo de Dados» [.small]#&#91;fpy.li/2j&#93;# de _A Referência da Linguagem Python_
11591163
inicia com uma explicação bastante clara sobre identidades e valores de objetos.
11601164

11611165
Wesley Chun, autor da série _Core Python_,
1162-
apresentou «Understanding Python's Memory Model, Mutability, and Methods» [.small]#&#91;fpy.li/6-8&#93;#
1163-
(EN) na EuroPython 2011, discutindo não apenas o tema desse capítulo como também o uso de métodos especiais.
1166+
apresentou «_Understanding Python's Memory Model, Mutability, and Methods_» [.small]#&#91;fpy.li/6-8&#93;#
1167+
na EuroPython 2011, discutindo não apenas o tema desse capítulo como também o uso de métodos especiais.
11641168

1165-
Doug Hellmann escreveu os posts «copy — Duplicate Objects» [.small]#&#91;fpy.li/6-9&#93;# (EN) e
1166-
«weakrefGarbage-Collectable References to Objects» [.small]#&#91;fpy.li/6-10&#93;# (EN),
1169+
Doug Hellmann escreveu os posts «_copy—Duplicate Objects_» [.small]#&#91;fpy.li/6-9&#93;# e
1170+
«weakrefGarbage-Collectable References to Objects» [.small]#&#91;fpy.li/6-10&#93;#,
11671171
cobrindo alguns dos tópicos que acabamos de tratar.
11681172

11691173
Você pode encontrar mais informações sobre o coletor de lixo geracional do CPython em
1170-
«gcInterface para o coletor de lixo» [.small]#&#91;fpy.li/3y&#93;#,
1174+
«gcInterface para o coletor de lixo» [.small]#&#91;fpy.li/3y&#93;#,
11711175
que começa com a frase "Este módulo fornece uma interface para o coletor de lixo opcional."
1172-
O adjetivo "opcional" aqui pode ser surpreendente,
1173-
mas o «capítulo "Modelo de Dados"» [.small]#&#91;fpy.li/2j&#93;# também afirma:
1176+
O adjetivo "opcional" pode ser surpreendente,
1177+
mas o capítulo «Modelo de Dados» [.small]#&#91;fpy.li/2j&#93;# também afirma:
11741178

11751179
[quote]
11761180
____
@@ -1180,17 +1184,17 @@ desde que nenhum objeto que ainda esteja acessível seja coletado.
11801184
____
11811185

11821186
Pablo Galindo escreveu um texto mais aprofundado sobre o Coletor de Lixo em Python, em
1183-
«Design of CPython’s Garbage Collector» [.small]#&#91;fpy.li/6-12&#93;# (EN)
1187+
«_Design of CPython’s Garbage Collector_» [.small]#&#91;fpy.li/6-12&#93;#
11841188
no «_Python Developer’s Guide_» [.small]#&#91;fpy.li/6-13&#93;#,
11851189
voltado para contribuidores novos e experientes da implementação CPython.
11861190

11871191
O CPython 3.4 aperfeiçoou o tratamento de objetos que implementam `+__del__+`,
1188-
como descrito em «PEP 442--Safe object finalization» [.small]#&#91;fpy.li/6-14&#93;# (EN).
1192+
como descrito em «PEP 442--Safe object finalization» [.small]#&#91;fpy.li/6-14&#93;#.
11891193

1190-
A Wikipedia tem um artigo sobre «string interning» [.small]#&#91;fpy.li/6-15&#93;# (EN),
1194+
A Wikipedia tem um artigo sobre «string interning» [.small]#&#91;fpy.li/6-15&#93;#,
11911195
que menciona o uso desta técnica em várias linguagens, incluindo Python.
11921196

1193-
A Wikipedia também tem um artigo sobre «Haddocks' Eyes» [.small]#&#91;fpy.li/6-16&#93;#,
1197+
A Wikipedia também tem um artigo sobre «_Haddocks' Eyes_» [.small]#&#91;fpy.li/6-16&#93;#,
11941198
a canção de Lewis Carroll que mencionei no início deste capítulo.
11951199
Os editores da Wikipedia escreveram que a letra é usada em trabalhos de lógica e filosofia
11961200
"para elaborar o status simbólico do conceito de 'nome':
@@ -1312,10 +1316,10 @@ with open('test.txt', 'wt', encoding='utf-8') as fp:
13121316
fp.write('1, 2, 3')
13131317
----
13141318
1315-
Se você tiver interesse no assunto de coletores de lixo,
1316-
você talvez queira ler o artigo de Thomas Perl,
1317-
«Python Garbage Collector Implementations: CPython, PyPy and GaS» [.small]#&#91;fpy.li/6-17&#93;#
1318-
(EN), onde eu aprendi esses detalhes sobre a segurança de `open().write()` em CPython.
1319+
Se tiver interesse no assunto de coletores de lixo,
1320+
talvez queira ler o artigo de Thomas Perl,
1321+
«_Python Garbage Collector Implementations: CPython, PyPy and GaS_» [.small]#&#91;fpy.li/6-17&#93;#,
1322+
onde aprendi esses detalhes sobre a segurança de `open().write()` em CPython.
13191323
13201324
[role="soapbox-title"]
13211325
*Passagem de parâmetros: chamada por compartilhamento*

0 commit comments

Comments
 (0)