Skip to content

Commit 026922f

Browse files
committed
links curtos para capítulos
1 parent 95c4070 commit 026922f

File tree

9 files changed

+207
-48
lines changed

9 files changed

+207
-48
lines changed

replacer.ipynb

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 15,
6+
"id": "eb57d79f-c9cd-45a6-bc29-8a4cbd9dc87e",
7+
"metadata": {},
8+
"outputs": [],
9+
"source": [
10+
"def to_int(s):\n",
11+
" try:\n",
12+
" n = int(s)\n",
13+
" except ValueError:\n",
14+
" n = int(s[0]) * 10 + ord(s[1])\n",
15+
" return n\n",
16+
"\n",
17+
"def get_id(s):\n",
18+
" return s[s.index('#ch_')+1:]"
19+
]
20+
},
21+
{
22+
"cell_type": "code",
23+
"execution_count": 24,
24+
"id": "2ec7ea76-776f-48f7-b84b-d172d41cb004",
25+
"metadata": {},
26+
"outputs": [
27+
{
28+
"name": "stdout",
29+
"output_type": "stream",
30+
"text": [
31+
"/4q /13 ch_ifaces_prot_abc\n",
32+
"/4r /16 ch_op_overload\n",
33+
"/4s /17 ch_generators\n",
34+
"/4t /12 ch_seq_methods\n",
35+
"/53 /24 ch_class_metaprog\n",
36+
"/54 /15 ch_more_types\n",
37+
"/55 /23 ch_descriptors\n",
38+
"/56 /14 ch_inheritance\n",
39+
"/57 /21 ch_async\n",
40+
"/5c /9 ch_closure_decorator\n",
41+
"/5d /10 ch_design_patterns\n",
42+
"{'/4q': '/13',\n",
43+
" '/4r': '/16',\n",
44+
" '/4s': '/17',\n",
45+
" '/4t': '/12',\n",
46+
" '/53': '/24',\n",
47+
" '/54': '/15',\n",
48+
" '/55': '/23',\n",
49+
" '/56': '/14',\n",
50+
" '/57': '/21',\n",
51+
" '/5c': '/9',\n",
52+
" '/5d': '/10'}\n"
53+
]
54+
}
55+
],
56+
"source": [
57+
"with open('links/FPY.LI.htaccess') as fp:\n",
58+
" lines = fp.readlines()\n",
59+
"\n",
60+
"PRE = 'https://pythonfluente.com/2/#ch_'\n",
61+
"\n",
62+
"id2n = {}\n",
63+
"subs = {}\n",
64+
"\n",
65+
"for line in lines:\n",
66+
" try:\n",
67+
" _, short, long = line.strip().split()\n",
68+
" except ValueError:\n",
69+
" continue\n",
70+
" if not long.startswith(PRE):\n",
71+
" continue\n",
72+
" n = to_int(short[1:])\n",
73+
" id = get_id(long)\n",
74+
" if n in range(1, 25):\n",
75+
" id2n[id] = n\n",
76+
" else:\n",
77+
" print(f'{short} /{id2n[id]} {id}')\n",
78+
" subs[short] = f'/{id2n[id]}'\n",
79+
"\n",
80+
"from pprint import pprint\n",
81+
"pprint(subs)"
82+
]
83+
},
84+
{
85+
"cell_type": "code",
86+
"execution_count": 31,
87+
"id": "d4efc774-3fae-4dd2-91c9-284985f3bddc",
88+
"metadata": {},
89+
"outputs": [
90+
{
91+
"name": "stdout",
92+
"output_type": "stream",
93+
"text": [
94+
"vol1/cap03.adoc\n",
95+
"vol1/Copyright-pb.adoc\n",
96+
"vol1/cap02.adoc\n",
97+
"vol1/cap05.adoc\n",
98+
"vol1/cap04.adoc\n",
99+
"vol1/cap08.adoc\n",
100+
"vol1/Copyright-cor.adoc\n",
101+
"vol1/cap07.adoc\n",
102+
"vol1/cap06.adoc\n",
103+
"vol1/titulos-vol1.adoc\n",
104+
"vol1/vol1-pb.adoc\n",
105+
"vol1/vol1-cor.adoc\n",
106+
"vol1/cap01.adoc\n",
107+
"vol1/Prefacio.adoc\n"
108+
]
109+
}
110+
],
111+
"source": [
112+
"from glob import glob\n",
113+
"\n",
114+
"link = 'fpy.li{}&'\n",
115+
"\n",
116+
"for name in glob('vol1/*.adoc'):\n",
117+
" print(name)\n",
118+
" with open(name) as fp:\n",
119+
" adoc = fp.read()\n",
120+
" for old, new in subs.items():\n",
121+
" old, new = link.format(old), link.format(new)\n",
122+
" adoc = adoc.replace(old, new)\n",
123+
" with open(name, 'w', encoding='utf8') as fp:\n",
124+
" fp.write(adoc)\n",
125+
"\n",
126+
" "
127+
]
128+
},
129+
{
130+
"cell_type": "code",
131+
"execution_count": null,
132+
"id": "e801a363-bb8c-4db9-ae1b-216fc1dbb27c",
133+
"metadata": {},
134+
"outputs": [],
135+
"source": []
136+
}
137+
],
138+
"metadata": {
139+
"kernelspec": {
140+
"display_name": "Python 3 (ipykernel)",
141+
"language": "python",
142+
"name": "python3"
143+
},
144+
"language_info": {
145+
"codemirror_mode": {
146+
"name": "ipython",
147+
"version": 3
148+
},
149+
"file_extension": ".py",
150+
"mimetype": "text/x-python",
151+
"name": "python",
152+
"nbconvert_exporter": "python",
153+
"pygments_lexer": "ipython3",
154+
"version": "3.14.0rc1"
155+
}
156+
},
157+
"nbformat": 4,
158+
"nbformat_minor": 5
159+
}

vol1/cap01.adoc

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ startref="len01")))((("", startref="pycard01")))((("", startref="SMgetitem01")))
321321
Como foi implementado até aqui, um `FrenchDeck` não pode ser embaralhado,
322322
porque as cartas e suas posições não podem ser alteradas,
323323
exceto violando o encapsulamento e manipulando o atributo `_cards` diretamente.
324-
No «Capítulo 13» [.small]#[vol.2, fpy.li/4q]#
324+
No «Capítulo 13» [.small]#[vol.2, fpy.li/13]#
325325
vamos corrigir isso acrescentando um método `+__setitem__+` de uma linha.
326326
Você consegue imaginar como ele seria implementado?
327327
=====================================================================
@@ -374,7 +374,7 @@ determinar o valor booleano de um objeto, e implementar coleções.
374374
Vários((("special methods", "emulating numeric types", id="SMnumeric01")))((("numeric types",
375375
"emulating using special methods", id="NTemul01")))
376376
métodos especiais permitem que objetos criados pelo usuário respondam a operadores como `+`.
377-
Vamos tratar disso com mais detalhes no «Capítulo 16» [.small]#[vol.2, fpy.li/4r]#.
377+
Vamos tratar disso com mais detalhes no «Capítulo 16» [.small]#[vol.2, fpy.li/16]#.
378378
Aqui nosso objetivo é continuar ilustrando o uso dos métodos especiais, através de outro exemplo simples.
379379

380380
Vamos((("vectors", "representing two-dimensional", id="Vtwo01"))) implementar uma classe para representar
@@ -385,7 +385,7 @@ vetores bidimensionais—isto é, vetores euclidianos como aqueles usados em mat
385385
======
386386
O tipo embutido `complex` pode ser usado para representar vetores bidimensionais,
387387
mas nossa classe pode ser estendida para representar vetores N-dimensionais.
388-
Faremos isso no «Capítulo 17» [.small]#[vol.3, fpy.li/4s]#.
388+
Faremos isso no «Capítulo 17» [.small]#[vol.3, fpy.li/17]#.
389389
======
390390

391391
[[vectors_fig]]
@@ -454,14 +454,14 @@ para demonstrar o uso básico de `+__add__+` e `+__mul__+`.
454454
Nos dois casos, os métodos criam e devolvem uma nova instância de `Vector`,
455455
e não modificam nenhum dos operandos: `self` e `other` são apenas lidos.
456456
Esse é o comportamento esperado de operadores infixos: criar novos objetos e não tocar em seus operandos.
457-
Vou falar mais sobre esse tópico no «Capítulo 16» [.small]#[vol.2, fpy.li/4r]#.
457+
Vou falar mais sobre esse tópico no «Capítulo 16» [.small]#[vol.2, fpy.li/16]#.
458458

459459
[WARNING]
460460
====
461461
Da forma como está implementado, o <<ex_vector2d>> permite multiplicar um `Vector` por um número,
462462
mas não um número por um `Vector`,
463463
violando a propriedade comutativa da multiplicação escalar.
464-
Vamos consertar isso com o método especial `+__rmul__+` no «Capítulo 16» [.small]#&#91;vol.2, fpy.li/4r&#93;#.
464+
Vamos consertar isso com o método especial `+__rmul__+` no «Capítulo 16» [.small]#&#91;vol.2, fpy.li/16&#93;#.
465465
====
466466

467467
Nas seções seguintes vamos discutir os outros métodos especiais em
@@ -581,7 +581,7 @@ id="SMcollection01")))((("Collection API", id="Cspeical01")))((("ABCs (abstract
581581
as interfaces dos tipos de coleções essenciais na linguagem.
582582
Todas as classes no diagrama são ABCs—_classes base abstratas_
583583
(_ABC_ é sigla para _Abstract Base Class_).
584-
As ABCs e o módulo `collections.abc` são tratados no «Capítulo 13» [.small]#&#91;vol.2, fpy.li/4q&#93;#.
584+
As ABCs e o módulo `collections.abc` são tratados no «Capítulo 13» [.small]#&#91;vol.2, fpy.li/13&#93;#.
585585
O objetivo dessa pequena seção é dar uma visão panorâmica das interfaces das coleções mais importantes de Python,
586586
mostrando como elas são criadas a partir de métodos especiais.
587587

@@ -663,7 +663,7 @@ Operadores infixos e numéricos são suportados pelos métodos especiais listado
663663
<<special_operators_tbl>>.
664664
Aqui os nomes mais recentes são `+__matmul__+`, `+__rmatmul__+`, e `+__imatmul__+`,
665665
adicionados no Python 3.5 para suportar o uso de `@` como operador de multiplicação de matrizes,
666-
como veremos no «Capítulo 16» [.small]#&#91;vol.2, fpy.li/4r&#93;#.((("special methods", "special method names and symbols for operators")))
666+
como veremos no «Capítulo 16» [.small]#&#91;vol.2, fpy.li/16&#93;#.((("special methods", "special method names and symbols for operators")))
667667

668668
[[special_operators_tbl]]
669669
.Nomes e símbolos de métodos especiais para operadores
@@ -686,7 +686,7 @@ Python invoca um método especial de operador reverso no segundo argumento
686686
quando o método especial correspondente não pode ser usado no primeiro operando.
687687
Atribuições aumentadas são um atalho combinando um operador infixo com uma atribuição de variável, por exemplo `a += b`.
688688
689-
O «Capítulo 16» [.small]#&#91;vol.2, fpy.li/4r&#93;#
689+
O «Capítulo 16» [.small]#&#91;vol.2, fpy.li/16&#93;#
690690
explica em detalhes os operadores reversos e a atribuição aumentada.((("", startref="PDMspmtov01")))
691691
====
692692

@@ -736,15 +736,15 @@ uma para depuração e registro (_log_), outra para apresentar aos usuários fin
736736
Emular sequências, como mostrado com o exemplo do `FrenchDeck`, é um dos usos mais comuns dos métodos especiais.
737737
Por exemplo, bibliotecas de banco de dados frequentemente devolvem resultados de consultas na forma de coleções similares a sequências.
738738
Tirar o máximo proveito dos tipos de sequências existentes é o assunto do <<ch_sequences>>.
739-
Como implementar suas próprias sequências será visto no «Capítulo 12» [.small]#&#91;vol.2, fpy.li/4t&#93;#,
739+
Como implementar suas próprias sequências será visto no «Capítulo 12» [.small]#&#91;vol.2, fpy.li/12&#93;#,
740740
onde criaremos uma extensão multidimensional da classe `Vector`.
741741

742742
Graças à sobrecarga de operadores, Python oferece uma rica seleção de tipos numéricos,
743743
desde os tipos embutidos até `decimal.Decimal` e `fractions.Fraction`,
744744
todos eles suportando operadores aritméticos infixos.
745745
A biblioteca de ciência de dados _NumPy_ suporta operadores infixos com matrizes e tensores.
746746
A implementação de operadores—incluindo operadores reversos e atribuição aumentada—será vista no
747-
«Capítulo 16» [.small]#&#91;vol.2, fpy.li/4r&#93;#,
747+
«Capítulo 16» [.small]#&#91;vol.2, fpy.li/16&#93;#,
748748
usando melhorias do exemplo `Vector`.
749749

750750
Também veremos o uso e a implementação da maioria dos outros métodos especiais do Modelo de Dados de Python ao longo deste livro.

vol1/cap02.adoc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Tópicos específicos sobre listas, tuplas, arrays e filas também foram incluí
3232
mas os detalhes sobre strings Unicode e sequências de bytes são tratados no <<ch_str_bytes>>.
3333
Além disso, a ideia aqui é falar sobre os tipos de sequências prontas para usar.
3434
A criação de novos tipos de sequência é o tema do
35-
«Capítulo 12» [.small]#&#91;vol.2, fpy.li/4t&#93;#.
35+
«Capítulo 12» [.small]#&#91;vol.2, fpy.li/12&#93;#.
3636

3737
Os((("sequences", "topics covered"))) principais tópicos cobertos neste capítulo são:
3838

@@ -123,7 +123,7 @@ A <<sequence_uml>> ajuda a visualizar como as sequências mutáveis herdam todos
123123
das sequências imutáveis e implementam vários métodos adicionais.
124124
Os tipos embutidos de sequências na verdade não são subclasses das classes base abstratas (ABCs)
125125
`Sequence` e `MutableSequence`, mas sim _subclasses virtuais_ registradas com aquelas
126-
ABCs—como veremos no «Capítulo 13» [.small]#&#91;vol.2, fpy.li/4q&#93;#.
126+
ABCs—como veremos no «Capítulo 13» [.small]#&#91;vol.2, fpy.li/13&#93;#.
127127
Por serem subclasses virtuais, `tuple` e `list` passam nesses testes:
128128

129129
[source, python]
@@ -452,7 +452,7 @@ nunca é criada neste exemplo.
452452

453453
[NOTE]
454454
====
455-
O «Capítulo 17» [.small]#&#91;vol.3, fpy.li/4s&#93;# explica em detalhes o funcionamento de geradoras.
455+
O «Capítulo 17» [.small]#&#91;vol.3, fpy.li/17&#93;# explica em detalhes o funcionamento de geradoras.
456456
A ideia aqui é apenas mostrar o uso de expressões geradores para inicializar sequências diferentes de listas,
457457
ou produzir uma saída que não precise ser mantida na memória.
458458
====
@@ -667,7 +667,7 @@ Entretanto, `reversed(my_tuple)` funciona sem esse método; ele serve apenas par
667667
| `+s.__len__()+` | ● | ● | `+len(s)+`—número de itens
668668
| `+s.__mul__(n)+` | ● | ● | `+s * n+`—concatenação repetida
669669
| `+s.__imul__(n)+` | ● | | `+s *= n+`—concatenação repetida interna
670-
| `+s.__rmul__(n)+` | ● | ● | `+n * s+`—concatenação repetida reversafootnote:[Operadores reversos são explicados no «Capítulo 16» [.small]#&#91;vol.2, fpy.li/4r&#93;.&#93;#]
670+
| `+s.__rmul__(n)+` | ● | ● | `+n * s+`—concatenação repetida reversafootnote:[Operadores reversos são explicados no «Capítulo 16» [.small]#&#91;vol.2, fpy.li/16&#93;.&#93;#]
671671
| `s.pop([p])` | ● | | Remove e devolve o último item ou o item na posição opcional `p`
672672
| `s.remove(e)` | ● | | Remove o primeiro item de valor igual a `e`
673673
| `s.reverse()` | ● | | Inverte a ordem dos itens internamente
@@ -1324,7 +1324,7 @@ recurso comum a `list`, `tuple`, `str`, e a todos os tipos de sequência em Pyth
13241324
é o suporte a operações de fatiamento, que são mais potentes do que a maioria das pessoas percebe.
13251325

13261326
Nesta seção descrevemos o _uso_ dessas formas avançadas de fatiamento.
1327-
Sua implementação em uma classe definida pelo usuário será tratada no «Capítulo 12» [.small]#&#91;vol.2, fpy.li/4t&#93;#,
1327+
Sua implementação em uma classe definida pelo usuário será tratada no «Capítulo 12» [.small]#&#91;vol.2, fpy.li/12&#93;#,
13281328
mantendo nossa filosofia de tratar de classes prontas para usar nessa parte do livro,
13291329
e da criação de novas classes na
13301330
«Parte III—Classes e protocolos» [.small]#&#91;vol.2, fpy.li/4v&#93;#.
@@ -1661,7 +1661,7 @@ Para sequências imutáveis, obviamente isso não pode acontecer.
16611661
<<<
16621662
O que acabei de escrever sobre `+=` também se aplica a `\*=`, que é implementado via `++__imul__++`.
16631663
Os métodos especiais `++__iadd__++` e `++__imul__++` são tratados no
1664-
«Capítulo 16» [.small]#&#91;vol.2, fpy.li/4r&#93;#.
1664+
«Capítulo 16» [.small]#&#91;vol.2, fpy.li/16&#93;#.
16651665

16661666
Veja uma demonstração de `*=` com uma sequência mutável e depois com uma sequência imutável:
16671667

@@ -1836,7 +1836,7 @@ da Wikipedia em inglês para uma descrição mais detalhada deste tópico.
18361836

18371837
A função embutida `sorted`, por outro lado, cria e devolve uma nova lista.
18381838
Ela aceita qualquer objeto iterável como um argumento, incluindo sequências imutáveis e geradores
1839-
(veja o «Capítulo 17» [.small]#&#91;vol.3, fpy.li/4s&#93;#).
1839+
(veja o «Capítulo 17» [.small]#&#91;vol.3, fpy.li/17&#93;#).
18401840
Independente do tipo do iterável passado a `sorted`, ela sempre cria e devolve uma nova lista.
18411841

18421842
<<<

vol1/cap03.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ O operador `|` cria um novo mapeamento:
180180

181181
O tipo do novo mapeamento normalmente será o mesmo do operando da esquerda—no exemplo,
182182
`d1`—mas ele pode ser do tipo do segundo operando se tipos definidos pelo usuário estiverem envolvidos na operação,
183-
dependendo das regras de sobrecarga de operadores, que exploraremos no «Capítulo 16» [.small]#&#91;vol.2, fpy.li/4r&#93;#.
183+
dependendo das regras de sobrecarga de operadores, que exploraremos no «Capítulo 16» [.small]#&#91;vol.2, fpy.li/16&#93;#.
184184

185185
Para atualizar mapeamentos existentes internamente, use `|=`.
186186
Retomando o exemplo anterior, ali `d1` não foi modificado.
@@ -331,7 +331,7 @@ True
331331
====
332332
Usar `isinstance` com uma ABC é muitas vezes melhor que verificar se um argumento de função
333333
é do tipo concreto `dict`, porque daí tipos alternativos de mapeamentos podem ser usados.
334-
Vamos discutir isso em detalhes no «Capítulo 13» [.small]#&#91;vol.2, fpy.li/4q&#93;#.
334+
Vamos discutir isso em detalhes no «Capítulo 13» [.small]#&#91;vol.2, fpy.li/13&#93;#.
335335
====
336336

337337
[[mapping_uml]]
@@ -439,7 +439,7 @@ A <<mapping_methods_tbl>> mostra os métodos implementados por `dict` e pelas va
439439
| `d.pop(k, [default])` | ● | ● | ● | Remove e devolve valor em `k`, ou `default` ou `None`, se `k` não existir
440440
| `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.]
441441
| `+d.__reversed__()+` | ● | ● | ● | Suporte a `reverse(d)`—devolve um iterador de chaves, da última para a primeira a serem inseridas
442-
| `+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;#]
442+
| `+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/16&#93;.&#93;#]
443443
|`d.setdefault(k, [default])` | ● | ● | ● | Se `k in d`, devolve `d[k]`; senão, atribui `d[k] = default` e devolve isso
444444
| `+d.__setitem__(k, v)+` | ● | ● | ● | `d[k] = v`—coloca `v` em `k`
445445
| `d.update(m, [**kwargs])` | ● | ● | ● | Atualiza `d` com itens de um mapeamento ou iterável de pares `(chave, valor)`

0 commit comments

Comments
 (0)