Skip to content

Commit c089843

Browse files
committed
cap12: links curtos
1 parent e1ffcb8 commit c089843

File tree

4 files changed

+56
-52
lines changed

4 files changed

+56
-52
lines changed

links/FPY.LI.htaccess

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,7 +1264,16 @@ RedirectTemp /67 https://docs.python.org/pt-br/3/tutorial/modules.html#more-o
12641264
RedirectTemp /68 https://docs.python.org/pt-br/3/library/gettext.html#gettext.NullTranslations
12651265
RedirectTemp /69 https://docs.python.org/pt-br/3/reference/datamodel.html#basic-customization
12661266

1267-
# changes to introduce short URLs for chapters
1268-
1267+
# changed to introduce short URLs for chapters
12691268
# was /22, now /6a
1270-
RedirectTemp /6a https://pythonfluente.com/2/#pattern_matching_case_study_sec
1269+
RedirectTemp /6a https://pythonfluente.com/2/#pattern_matching_case_study_sec
1270+
1271+
# cap12: appended 2025-10-20 17:10:58
1272+
RedirectTemp /6b https://pt.wikipedia.org/wiki/Modelo_vetorial_em_sistemas_de_recupera%C3%A7%C3%A3o_da_informa%C3%A7%C3%A3o
1273+
RedirectTemp /6c https://pt.wikipedia.org/wiki/Princ%C3%ADpio_da_substitui%C3%A7%C3%A3o_de_Liskov
1274+
RedirectTemp /6d https://docs.python.org/pt-br/3/library/functions.html#enumerate
1275+
RedirectTemp /6e https://docs.python.org/pt-br/3/reference/datamodel.html#special-method-names
1276+
RedirectTemp /6f https://pt.wikipedia.org/wiki/Princ%C3%ADpio_KISS
1277+
RedirectTemp /6g https://pt.wikipedia.org/wiki/Duck_typing
1278+
RedirectTemp /6h https://pt.wikipedia.org/wiki/APL_(linguagem_de_programa%C3%A7%C3%A3o)
1279+
RedirectTemp /6j https://pt.wikipedia.org/wiki/FP_(linguagem_de_programa%C3%A7%C3%A3o)

online/cap11.adoc

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -638,8 +638,8 @@ Agora que nossos vetores estão razoavelmente protegidos contra mutação
638638
acidental, podemos implementar o método `+__hash__+`. Ele deve devolver um `int`
639639
e, idealmente, levar em consideração os hashs dos atributos do objeto usados
640640
também no método `+__eq__+`, pois objetos que são considerados iguais ao serem
641-
comparados devem ter o mesmo _hash_. A pass:[<a class="orm:hideurl"
642-
href="https://fpy.li/66">documentação</a>]
641+
comparados devem ter o mesmo _hash_. A
642+
https://fpy.li/66[documentação]
643643
do método especial `+__hash__+` sugere computar o _hash_ de uma tupla com os
644644
componentes, e é isso que fazemos no <<ex_vector2d_v3_hash>>.
645645

@@ -906,7 +906,7 @@ startref="Aprivate11")))((("", startref="POprivate11")))
906906

907907

908908
[[slots_sec]]
909-
=== Economizando memória com pass:[__slots__]
909+
=== Economizando memória com `+__slots__+`
910910

911911
Por((("Pythonic objects", "saving memory with
912912
&#x005F;&#x005F;slots&#x005F;&#x005F;",
@@ -1019,7 +1019,7 @@ fracas, então é preciso incluir `+__weakref__+` entre os atributos nomeados e
10191019

10201020
Vejamos agora o efeito da adição de `+__slots__+` a `Vector2d`.
10211021

1022-
==== Uma medida simples da economia gerada por pass:[__slots__]
1022+
==== Uma medida simples da economia gerada por `+__slots__+`
10231023

10241024
<<ex_vector2d_v3_slots>> mostra a implementação de `+__slots__+` em `Vector2d`.
10251025

@@ -1220,9 +1220,9 @@ apenas para sobrescrever o atributo de classe `typecode`.
12201220
<3> Verifica o `repr` de `sv`.
12211221
<4> Verifica que a quantidade de bytes exportados é 9, e não 17 como antes.
12221222

1223-
Esse exemplo também explica porque não escrevi explicitamente o `class_name` em
1224-
pass:[<code>Vector2d.&#x200b;__repr__</code>], optando por obtê-lo de
1225-
`+type(self).__name__+`, assim:
1223+
Esse exemplo também explica porque não atribui a constante `'Vector2d'`
1224+
ao `class_name` no método `+__repr__+`, optando por obter o nome da
1225+
classe através de `+type(self).__name__+`:
12261226

12271227
[source, python]
12281228
----
@@ -1236,7 +1236,7 @@ pass:[<code>Vector2d.&#x200b;__repr__</code>], optando por obtê-lo de
12361236
Se eu tivesse escrito o `class_name` explicitamente, subclasses de `Vector2d`
12371237
como `ShortVector2d` teriam que sobrescrever `+__repr__+` só para mudar o
12381238
`class_name`. Lendo o nome do `type` da instância, tornei `+__repr__+` mais
1239-
seguro de ser herdado.
1239+
seguro para ser herdado.
12401240

12411241
Aqui termina nossa conversa sobre a criação de uma classe simples, que
12421242
aproveita modelo de dados de Python para se adaptar bem ao restante da linguagem:
@@ -1432,9 +1432,9 @@ quando esses métodos não fazem nada de útil—porque a API não pode evoluir
14321432
atributos públicos simples para _getters_ e _setters_ sem quebrar todo o código
14331433
que já use aqueles atributos.
14341434
1435-
Além disso, como Martelli, Ravenscroft e Holden observam no pass:[<a
1436-
class="orm:hideurl" href="https://fpy.li/pynut3"><em>Python in a Nutshell</em>,
1437-
3rd ed.</a>], digitar chamadas a _getters_ e _setters_ por toda parte é
1435+
Além disso, como Martelli, Ravenscroft e Holden observam no
1436+
https://fpy.li/pynut3[Python in a Nutshell 3rd ed.],
1437+
digitar chamadas a _getters_ e _setters_ por toda parte é
14381438
patético. Você é obrigado a escrever coisas como:
14391439
14401440
[source, python]
@@ -1527,9 +1527,8 @@ Não há magia aqui: _expose.py_ usa a API de reflexão de Java para obter uma
15271527
referência para o campo privado chamado `'secret'`, e então chama
15281528
`secret_field.setAccessible(True)` para tornar acessível seu conteúdo. A mesma
15291529
coisa pode ser feita com código Java, claro (mas exige mais que o triplo de
1530-
linhas; veja o arquivo https://fpy.li/11-16[_Expose.java_] no pass:[<a
1531-
href="https://fpy.li/code" class="orm:hideurl">repositório de código do
1532-
<em>Python Fluente</em></a>]).
1530+
linhas; veja o arquivo https://fpy.li/11-16[_Expose.java_] no
1531+
https://fpy.li/code[repositório de código] deste livro.
15331532
15341533
A chamada `.setAccessible(True)` só falhará se o script Jython ou o programa
15351534
principal em Java (por exemplo, `Expose.class`) estiverem rodando sob a

online/cap12.adoc

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Também vamos implementar, com `+__getattr__+`, o acesso dinâmico a atributos,
2626
como forma de substituir as propriedades apenas para leitura
2727
que usamos no `Vector2d`&#x2014;apesar disso não ser comum em sequências.
2828

29-
Al´m disso, teremo uma discussão conceitual sobre a ideia de protocolos como uma interfaces informais.
29+
Além disso, teremos uma discussão conceitual sobre a ideia de protocolos como interfaces informais.
3030
Vamos discutir a relação entre protocolos e _duck typing_,
3131
e as implicações práticas disso na criação de seus próprios tipos.
3232

@@ -65,7 +65,7 @@ dimensions"))) precisa de vetores com 1.000 dimensões? Vetores N-dimensionais
6565
(com valores grandes de N) são bastante utilizados em recuperação de informação,
6666
onde documentos e consultas textuais são representados como vetores, com uma
6767
dimensão para cada palavra. Isso se chama
68-
https://pt.wikipedia.org/wiki/Modelo_vetorial_em_sistemas_de_recupera%C3%A7%C3%A3o_da_informa%C3%A7%C3%A3o[Modelo vetorial].
68+
https://fpy.li/6b[Modelo vetorial].
6969
Nesse modelo, a métrica fundamental de relevância é a
7070
__similaridade de cosseno__—o cosseno do ângulo entre um vetor que representa a
7171
consulta e um vetor representando um documento. Conforme o ângulo diminui, o valor
@@ -93,7 +93,7 @@ Entretanto, pela((("&#x005F;&#x005F;repr&#x005F;&#x005F;")))((("&#x005F;&#x005F;
9393
O <<ex_vector_demo>> mostra algumas maneiras de instanciar objetos do nosso novo `Vector`.
9494

9595
[[ex_vector_demo]]
96-
.Testes de pass:[<code>Vector.&#x5f;&#x5f;init&#x5f;&#x5f;</code>] e pass:[<code>Vector.&#x5f;&#x5f;repr&#x5f;&#x5f;</code>]
96+
.Testes de `+Vector.__init__+` e `+Vector.__repr__+`
9797
====
9898
[source, python]
9999
----
@@ -106,7 +106,10 @@ Vector([0.0, 1.0, 2.0, 3.0, 4.0, ...])
106106
----
107107
====
108108

109-
Exceto pela nova assinatura do construtor, me assegurei que todos os testes realizados com `Vector2d` (por exemplo, `Vector2d(3, 4)`) são bem sucedidos e produzem os mesmos resultados com um `Vector` de dois componentes, como `Vector([3, 4])`.
109+
Exceto pela nova assinatura do construtor, verifiquei que todos os testes
110+
realizados com `Vector2d` (por exemplo, `Vector2d(3, 4)`) passam e
111+
produzem os mesmos resultados com um `Vector` de dois componentes,
112+
como `Vector([3, 4])`.
110113

111114
[WARNING]
112115
====
@@ -184,7 +187,7 @@ Poderíamos criar `Vector` como uma subclasse de `Vector2d`, mas
184187
escolhi não fazer assim por duas razões. Em primeiro lugar, os construtores
185188
são incompatíveis, o que torna relação de super/subclasse desaconselhável,
186189
por violar o
187-
https://pt.wikipedia.org/wiki/Princ%C3%ADpio_da_substitui%C3%A7%C3%A3o_de_Liskov[princípio de substituição de Liskov].
190+
https://fpy.li/6c[princípio de substituição de Liskov].
188191
Seria possível contornar isso como um tratamento engenhoso dos argumenos em
189192
`+__init__+`, mas a segunda razão é mais importante: eu queria que `Vector` fosse
190193
um exemplo independente de uma classe que implementa o protocolo de sequência.
@@ -206,8 +209,8 @@ No contexto da programação orientada a objetos, um protocolo é uma interface
206209
informal, definida apenas na documentação (e não no código). Por exemplo, o
207210
protocolo de sequência no Python implica apenas no métodos `+__len__+` e
208211
`+__getitem__+`. Qualquer classe `Spam`, que implemente esses métodos com a
209-
assinatura e a semântica padrões, pode ser usada em qualquer lugar onde uma
210-
sequência for esperada. É irrelevante se `Spam` é uma subclasse dessa ou daquela
212+
assinatura e a semântica padrão, pode ser usada em qualquer lugar onde uma
213+
sequência é esperada. É irrelevante se `Spam` é uma subclasse dessa ou daquela
211214
outra classe; tudo o que importa é que ela fornece os métodos necessários. Vimos
212215
isso no <<ex_pythonic_deck>>, reproduzido aqui no <<ex_pythonic_deck_rep>>.
213216

@@ -320,7 +323,7 @@ Vejamos agora como Python transforma a sintaxe `my_seq[1:3]` em argumentos para
320323
[[how_slicing_works_sec]]
321324
==== Como funciona o fatiamento
322325

323-
Uma demonstração vale mais que mil palavras, então veja o <<ex_slice0>>.
326+
Uma demonstração vale mais que mil palavras, então veja o <<ex_slice0>>.
324327

325328
[[ex_slice0]]
326329
.Examinando o comportamento de `+__getitem__+` e fatias
@@ -443,7 +446,7 @@ porque não faz sentido tentar usar um `float` como índice de um array.
443446
====
444447
O uso excessivo de `isinstance` pode ser um sinal de design orientado a objetos ruim, mas tratar fatias em `+__getitem__+` é um caso de uso justificável.
445448
Na primeira edição, também usei um teste `isinstance` com `key`, para verificar se esse argumento era um inteiro.
446-
O uso de `operator.index` evita esse teste, e gera um pass:[<code>Type&#x200b;Error</code>] com uma mensagem muito informativa, se não for possível obter o `index` a partir de `key`.
449+
O uso de `operator.index` evita esse teste, e gera um `TypeError` com uma mensagem muito informativa, se não for possível obter o `index` a partir de `key`.
447450
Observe a última mensagem de erro no <<ex_vector_v2_demo>>, abaixo.
448451
====
449452

@@ -576,8 +579,8 @@ Após pensar um pouco sobre essa questão, veja a seguir a explicação para o q
576579
A inconsistência no <<ex_vector_v3_getattr_bug>> ocorre devido à forma como
577580
`+__getattr__+` funciona: Python só chama esse método como último recurso,
578581
quando o objeto não contém o atributo nomeado.
579-
Entretanto, após atribuirmos `v.x
580-
= 10`, o objeto `v` agora contém um atributo `x`, e então `+__getattr__+` não
582+
Entretanto, após atribuirmos `v.x = 10`, o objeto `v` agora contém
583+
um atributo `x`, e então `+__getattr__+` não
581584
será mais invocado para obter `v.x`: o interpretador vai apenas devolver o valor
582585
`10`, que agora está vinculado a `v.x`.
583586
Por outro lado, nossa implementação de
@@ -908,7 +911,7 @@ Assim que uma comparação é `False`, `all` devolve `False`. O <<ex_eq_all>> mo
908911
====
909912

910913
Observe que primeiro comparamos o `len()` dos operandos porque
911-
não queremos comparar item a item se os vetores tem tamanhos diferentes.
914+
não queremos comparar item a item se os vetores têm tamanhos diferentes.
912915

913916
O <<ex_eq_all>> é a implementação que escolhemos para `+__eq__+` em
914917
_vector_v4.py_.((("", startref="eq12")))((("", startref="hash12")))((("",
@@ -972,7 +975,7 @@ A função embutida `enumerate` é outra função geradora usada com frequência
972975
loops `for`, para evitar manipulação direta de variáveis índice. Quem não
973976
estiver familiarizado com `enumerate` deve estudar a seção dedicada a ela na
974977
documentação das
975-
https://docs.python.org/pt-br/3/library/functions.html#enumerate[Funções embutidas].
978+
https://fpy.li/6d[Funções embutidas].
976979
Voltaremos a falar sobre `zip` e `enumerate`, bem como
977980
várias outras funções geradores na biblioteca padrão, na
978981
<<stdlib_generators_sec>>.
@@ -1002,8 +1005,7 @@ Por este motivo, mudaremos o sufixo do formato customizado de `'p'` para `'h'`.
10021005
====
10031006
10041007
Como vimos na <<format_display_sec>>, ao estender a
1005-
https://docs.python.org/pt-br/3/library/string.html#formatspec[Minilinguagem de
1006-
especificação de formato] é melhor evitar a reutilização dos códigos de formato
1008+
https://fpy.li/63[Minilinguagem de especificação de formato] é melhor evitar a reutilização dos códigos de formato
10071009
usados por tipos embutidos. Em particular, nossa minilinguagens estendida também
10081010
usa os códigos de formato dos números de ponto flutuante (`'eEfFgGn%'`), com seus
10091011
significados originais, então devemos certamente evitar qualquer um daqueles.
@@ -1035,7 +1037,7 @@ Antes de podermos implementar as pequenas mudanças necessárias em
10351037
computar uma das coordenadas angulares (por exemplo, Φ~1~), e `angles()`, para
10361038
devolver um iterável com todas as coordenadas angulares. Não vou descrever a
10371039
matemática aqui; se você tiver curiosidade, a página
1038-
https://fpy.li/nsphere[_n_-sphere] da Wikipedia apresenta as
1040+
https://fpy.li/nsphere[_n_-sphere] da Wikipedia apresenta as
10391041
fórmulas que usei para calcular coordenadas esféricas a partir das coordendas
10401042
cartesianas no array de componentes de `Vector`.
10411043

@@ -1154,7 +1156,7 @@ recursivas. O artigo também inclui uma tabela mostrando funções similares a
11541156
_fold_ em dezenas de linguagens de programação.
11551157

11561158
Em
1157-
https://docs.python.org/2.5/whatsnew/pep-357.html[_What's New in Python 2.5_]
1159+
https://fpy.li/12-6[_What's New in Python 2.5_]
11581160
(Novidades no Python 2.5) há uma pequena explicação sobre o método `+__index__+`,
11591161
projetado para suportar métodos `+__getitem__+`, como vimos na
11601162
<<slice_aware_sec>>. A
@@ -1203,7 +1205,7 @@ implementando as partes da interface de arquivo relevantes no presente contexto"
12031205
12041206
Você poderia achar que implementar apenas parte de um protocolo é um desleixo,
12051207
mas isso tem a vantagem de manter as coisas simples. A
1206-
https://docs.python.org/pt-br/3/reference/datamodel.html#special-method-names[Seção3.3]
1208+
https://fpy.li/6e[Seção3.3]
12071209
do capítulo "Modelo de Dados" na documentação de Python sugere:
12081210
12091211
[quote]
@@ -1218,7 +1220,7 @@ ____
12181220
Quando((("KISS principle"))) não precisamos escrever métodos inúteis apenas para
12191221
cumprir o contrato de uma interface excessivamente detalhista e satisfazer o
12201222
compilador, fica mais fácil seguir o
1221-
https://pt.wikipedia.org/wiki/Princ%C3%ADpio_KISS[princípio KISS].
1223+
https://fpy.li/6f[princípio KISS].
12221224
12231225
Por outro lado, se quiser usar um checador de tipos para checar suas
12241226
implementações de protocolos, então uma definição mais estrita de "protocolo" é
@@ -1243,7 +1245,7 @@ checking in python?)" (_polimorfismo (era Re: Verificação de tipo em
12431245
python?_))]. Foi dali que veio a citação no início desse capítulo. Se você tiver
12441246
curiosidade sobre as origens literárias do termo "duck typing", e a aplicação
12451247
desse conceito de orientação a objetos em muitas linguagens, veja a página
1246-
https://pt.wikipedia.org/wiki/Duck_typing["Duck typing"] na Wikipedia.
1248+
https://fpy.li/6g[Duck typing] na Wikipedia.
12471249
12481250
12491251
[role="soapbox-title"]
@@ -1385,11 +1387,9 @@ ____
13851387
Fazemos somas com tanta frequência que eu não me importaria de forma
13861388
alguma se Python a tornasse uma função embutida. Mas `reduce(operator.add,
13871389
\...)` não é mesmo uma boa maneira de expressar isso, na minha opinião (e vejam
1388-
que, como um antigo APListafootnote:[NT: Aqui Martelli está se referindo à
1389-
linguagem
1390-
https://pt.wikipedia.org/wiki/APL_(linguagem_de_programa%C3%A7%C3%A3o[APL]]
1391-
e um apreciador da FPfootnote:[NT: E aqui à linguagem
1392-
https://pt.wikipedia.org/wiki/FP_(linguagem_de_programa%C3%A7%C3%A3o[FP]],
1390+
que, como um antigo APListafootnote:[NT: Aqui Martelli refere-se à
1391+
linguagem https://fpy.li/6h[APL]]
1392+
e um apreciador da FPfootnote:[NT: E aqui à linguagem https://fpy.li/6j[FP]],
13931393
eu _deveria_ gostar daquilo, mas não gosto).
13941394
13951395
____

online/cap13.adoc

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@
33
:example-number: 0
44
:figure-number: 0
55

6-
++++
7-
<blockquote>
8-
<p>Programe mirando uma interface, não uma implementação.</p>
9-
<p data-type="attribution">Gamma&#x2c; Helm&#x2c; Johnson&#x2c; Vlissides, First Principle of Object-Oriented Design<span data-type="footnote"><em> Design Patterns: Elements of Reusable Object-Oriented Software</em>, "Introduction," p. 18.</span></p>
10-
</blockquote>
11-
++++
12-
// [quote, Gamma&#x2c; Helm&#x2c; Johnson&#x2c; Vlissides, First Principle of Object-Oriented Design]
13-
// ____
14-
// Program to an interface, not an implementation.footnote:[Design Patterns: Elements of Reusable Object-Oriented Software, Introduction, p. 18.]
15-
// ____
6+
[quote, Gamma&#x2c; Helm&#x2c; Johnson&#x2c; Vlissides, First Principle of Object-Oriented Design]
7+
____
8+
Programe mirando uma interface,
9+
não uma implementação.footnote:[Design Patterns:
10+
Elements of Reusable Object-Oriented Software, Introduction, p. 18.]
11+
____
1612

1713
A programação orientada a objetos((("interfaces", "role in object-oriented programming")))
1814
tem tudo a ver com interfaces.

0 commit comments

Comments
 (0)