Skip to content

Commit 2b24e25

Browse files
committed
remover [.keep-together]
1 parent b69eb0d commit 2b24e25

File tree

9 files changed

+277
-167
lines changed

9 files changed

+277
-167
lines changed

links/FPY.LI.htaccess

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,3 +1288,6 @@ RedirectTemp /6r https://docs.python.org/pt-br/3/library/abc.html
12881288
RedirectTemp /6s https://docs.python.org/pt-br/dev/library/abc.html#abc.abstractmethod
12891289
RedirectTemp /6t https://docs.python.org/pt-br/3/library/os.html#os.urandom
12901290
RedirectTemp /6v https://pt.wikipedia.org/wiki/Princ%C3%ADpio_da_segrega%C3%A7%C3%A3o_de_interface
1291+
1292+
# cap13: appended 2025-11-13 14:52:00
1293+
RedirectTemp /6v https://docs.python.org/pt-br/3.14/library/typing.html#protocols

online/cap08.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ def show_count(count: int, word: str) -> str:
272272

273273
[TIP]
274274
====
275-
Em vez de digitar opções de linha de comando como [.keep-together]#`--disallow-incomplete-defs`#,
275+
Em vez de digitar opções de linha de comando como `--disallow-incomplete-defs`,
276276
você pode salvar sua configuração favorita da forma descrita na página
277277
https://fpy.li/8-8[Mypy configuration file] (EN) na documentação do Mypy.
278278
Você pode incluir configurações globais e configurações específicas para cada módulo.
@@ -1137,7 +1137,7 @@ Podemos resumir esse processo em quatro etapas:
11371137
11381138
. Tornar aquele comportamento o default a partir de Python 3.9: `list[str]` agora funciona sem que `future` precise ser importado.
11391139
1140-
. Descontinuar (_deprecate_) todos os tipos genéricos do módulo `typing`.footnote:[Uma de minhas contribuições para a documentação do módulo `typing` foi acrescentar dúzias de avisos de descontinuação, enquanto eu reorganizava as entradas abaixo de https://fpy.li/4b["Conteúdo do Módulo"] em subseções, sob a supervisão de Guido van [.keep-together]#Rossum#.] Avisos de descontinuação não serão emitidos pelo interpretador Python, porque os checadores de tipos devem sinalizar os tipos descontinuados quando o programa sendo checado tiver como alvo Python 3.9 ou posterior.
1140+
. Descontinuar (_deprecate_) todos os tipos genéricos do módulo `typing`.footnote:[Uma de minhas contribuições para a documentação do módulo `typing` foi acrescentar dúzias de avisos de descontinuação, enquanto eu reorganizava as entradas abaixo de https://fpy.li/4b["Conteúdo do Módulo"] em subseções, sob a supervisão de Guido van Rossum.] Avisos de descontinuação não serão emitidos pelo interpretador Python, porque os checadores de tipos devem sinalizar os tipos descontinuados quando o programa sendo checado tiver como alvo Python 3.9 ou posterior.
11411141
11421142
. Remover aqueles tipos genéricos redundantes na primeira versão de Python lançada cinco anos após Python 3.9. No ritmo atual, esse deverá ser Python 3.14, também conhecido como Python Pi.
11431143
****

online/cap13.adoc

Lines changed: 242 additions & 143 deletions
Large diffs are not rendered by default.

online/cap14.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ Originalmente, o Django oferecia uma série de funções, chamadas views genéri
607607

608608
Entretanto, as views genéricas originais eram funções, então não eram extensíveis. Se quiséssemos algo algo similar mas não exatamente igual a uma view de lista genérica, era preciso começar do zero.
609609

610-
O conceito de views baseadas em classes foi introduzido no Django 1.3, juntamente com um conjunto de classes de views genéricas divididas em classes base, mixins e classes concretas prontas para o uso. No Django 3.2, as classes base e as mixins estão no módulo `base` do pacote `django.views.generic`, ilustrado((("UML class diagrams", "django.views.generic.base module"))) na <<django_view_base_uml>>. No topo do diagrama vemos duas classes que se encarregam de responsabilidades muito diferentes: `View` e [.keep-together]#`TemplateResponseMixin`.#
610+
O conceito de views baseadas em classes foi introduzido no Django 1.3, juntamente com um conjunto de classes de views genéricas divididas em classes base, mixins e classes concretas prontas para o uso. No Django 3.2, as classes base e as mixins estão no módulo `base` do pacote `django.views.generic`, ilustrado((("UML class diagrams", "django.views.generic.base module"))) na <<django_view_base_uml>>. No topo do diagrama vemos duas classes que se encarregam de responsabilidades muito diferentes: `View` e `TemplateResponseMixin`.
611611

612612
[role="width-80"]
613613
[[django_view_base_uml]]

online/cap15.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1444,7 +1444,7 @@ de Eric Meijer e Peter Drayton.footnote:[O leitor de notas de rodapé se lembrar
14441444
Aprendi muito lendo as partes relevantes de alguns livros sobre outras linguagens que implementam algumas das mesmas ideias:
14451445

14461446
* https://fpy.li/15-44[_Atomic Kotlin_] (EN), de Bruce Eckel e Svetlana Isakova
1447-
[.keep-together]#(Mindview)#
1447+
(Mindview)
14481448
* https://fpy.li/15-45[_Effective Java_, 3rd ed.,] (EN), de Joshua Bloch (Addison-Wesley)
14491449
* https://fpy.li/15-46[_Programming with Types: TypeScript Examples_] (EN), de Vlad Riscutia (Manning)
14501450

online/cap17.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -962,7 +962,7 @@ O primeiro grupo contém funções geradoras de filtragem: elas produzem um subc
962962
[options="header"]
963963
|=============================================================================================================================================================================================================================================================
964964
|Módulo|Função|Descrição
965-
|[.keep-together]#`itertools`#|[.keep-together]#`compress(it, selector_it)`#|Consome dois iteráveis em paralelo; produz itens de `it` sempre que o item correspondente em `selector_it` é verdadeiro
965+
|`itertools`|`compress(it, selector_it)`|Consome dois iteráveis em paralelo; produz itens de `it` sempre que o item correspondente em `selector_it` é verdadeiro
966966
|`itertools`|`dropwhile(predicate, it)`|Consome `it`, pulando itens enquanto `predicate` resultar verdadeiro, e daí produz todos os elementos restantes (nenhuma verificação adicional é realizada)
967967
|(Embutida)|`filter(predicate, it)`|Aplica `predicate` para cada item de `iterable`, produzindo o item se `predicate(item)` for verdadeiro; se `predicate` for `None`, apenas itens verdadeiros serão produzidos
968968
|`itertools`|`filterfalse(predicate, it)`|Igual a `filter`, mas negando a lógica de `predicate`: produz itens sempre que `predicate` resultar falso
@@ -1012,7 +1012,7 @@ O((("mappings", "mapping generator functions"))) grupo seguinte contém os gerad
10121012
[options="header"]
10131013
|=============================================================================================================================================================================================================================================================
10141014
|Módulo|Função|Descrição
1015-
|[.keep-together]#`itertools`#|`accumulate(it, [func])`|Produz somas cumulativas; se `func` for fornecida, produz o resultado da aplicação de `func` ao primeiro par de itens, depois ao primeiro resultado e ao próximo item, etc.
1015+
|`itertools`|`accumulate(it, [func])`|Produz somas cumulativas; se `func` for fornecida, produz o resultado da aplicação de `func` ao primeiro par de itens, depois ao primeiro resultado e ao próximo item, etc.
10161016
|(embutida)|`enumerate(iterable, start=0)`|Produz tuplas de dois itens na forma `(index, item)`, onde `index` é contado a partir de `start`, e `item` é obtido do `iterable`
10171017
|(embutida)|`map(func, it1, [it2, …, itN])`|Aplica `func` a cada item de `it`, produzindo o resultado; se forem fornecidos N iteráveis, `func` deve aceitar N argumentos, e os iteráveis serão consumidos em paralelo
10181018
|`itertools`|`starmap(func, it)`|Aplica `func` a cada item de `it`, produzindo o resultado; o iterável de entrada deve produzir itens iteráveis `iit`, e `func` é aplicada na forma `func(*iit)`
@@ -1128,7 +1128,7 @@ O <<demo_merging_genfunc>> demonstra o uso das funções geradoras `itertools.ch
11281128
<5> `itertools.zip_longest` funciona como `zip`, exceto por consumir todos os iteráveis de entrada, preenchendo as tuplas de saída com `None` onde necessário.
11291129
<6> O argumento nomeado `fillvalue` especifica um valor de preenchimento customizado.
11301130
1131-
A geradora `itertools.product` é uma forma preguiçosa para calcular produtos cartesianos, que criamos usando compreensões de lista com mais de uma instrução `for` na <<cartesian_product_sec>>. Expressões geradoras com múltiplas instruções `for` também podem ser usadas para produzir produtos cartesianos de forma preguiçosa. O <<demo_product_genfunc>> demonstra [.keep-together]#`itertools.product`.#
1131+
A geradora `itertools.product` é uma forma preguiçosa para calcular produtos cartesianos, que criamos usando compreensões de lista com mais de uma instrução `for` na <<cartesian_product_sec>>. Expressões geradoras com múltiplas instruções `for` também podem ser usadas para produzir produtos cartesianos de forma preguiçosa. O <<demo_product_genfunc>> demonstra `itertools.product`.
11321132
11331133
[[demo_product_genfunc]]
11341134
.Exemplo da função geradora `itertools.product`

online/cap19.adoc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ include::../code/19-concurrency/spinner_proc.py[tags=SPINNER_PROC_SUPER]
328328
<4> O uso básico da classe `Process` é similar ao da classe `Thread`.
329329
<5> O objeto `spinner` aparece como <Process name='Process-1' parent=14868 initial>`,
330330
onde `14868` é o `id` do processo da instância de Python que está executando o
331-
[.keep-together]#_spinner_proc.py_.#
331+
_spinner_proc.py_.
332332

333333
As APIs básicas de `threading` e `multiprocessing` são similares,
334334
mas sua implementação é muito diferente, e `multiprocessing`
@@ -376,7 +376,7 @@ A versão com corrotinas do programa de animação é mais fácil de entender se
376376
include::../code/19-concurrency/spinner_async.py[tags=SPINNER_ASYNC_START]
377377
----
378378
====
379-
<1> `main` é a única função regular definida nesse programa—as outras são [.keep-together]#corrotinas#.
379+
<1> `main` é a única função regular definida nesse programa—as outras são corrotinas.
380380
<2> A função`asyncio.run` inicia o loop de eventos para controlar a corrotina que irá em algum momento colocar as outras corrotinas em movimento.
381381
A função `main` ficará bloqueada até que `supervisor` retorne.
382382
O valor de retorno de `supervisor` será o valor de retorno de `asyncio.run`.
@@ -554,7 +554,7 @@ Aqui está um resumo das diferenças e semelhanças notáveis entre as duas impl
554554
ele já esta agendado para rodar, mas uma instância de `Thread` precisa ser iniciada explicitamente através de uma chamada a seu método `start`.
555555
* Na `supervisor` da versão com threads, `slow` é uma função comum e é invocada diretamente pela thread principal. Na versão assíncrona da `supervisor`, `slow` é uma corrotina guiada por `await`.
556556
* Não há API para terminar uma thread externamente; em vez disso, é preciso enviar um sinal—como acionar o `done` no objeto `Event`. Para objetos `Task`, há o método de instância `Task.cancel()`, que dispara um `CancelledError` na expressão `await` na qual o corpo da corrotina está suspensa naquele momento.
557-
* A corrotina `supervisor` deve ser iniciada com `asyncio.run` na [.keep-together]#função# `main`.
557+
* A corrotina `supervisor` deve ser iniciada com `asyncio.run` na função `main`.
558558

559559
Essa comparação ajuda a entender como a concorrência é orquestrada com _asyncio_,
560560
em contraste com como isso é feito com o módulo `Threading`, possivelmente mais familiar ao leitor.
@@ -619,7 +619,7 @@ ____
619619

620620
Antes de executar o código ou continuar lendo,
621621
recomendo chegar as respostas por você mesmo.
622-
Depois, copie e modifique os exemplos pass:[<em>spinner_*.py</em>] como [.keep-together]#sugerido#.
622+
Depois, copie e modifique os exemplos pass:[<em>spinner_*.py</em>] como sugerido.
623623

624624
Agora as respostas, da mais fácil para a mais difícil.
625625

@@ -648,7 +648,7 @@ Mas se você tiver duas ou mais threads disputando por mais tempo da CPU, seu pr
648648
===== 3. Resposta para asyncio
649649
Se((("coroutines", "Global Interpreter Lock impact"))) você chamar `is_prime(5_000_111_000_222_021)` na corrotina `slow` do exemplo _spinner_async.py_,
650650
a animação nunca vai aparecer.
651-
O efeito seria o mesmo [.keep-together]#que vimos# no <<spinner_async_time_sleep_ex>>,
651+
O efeito seria o mesmo que vimos no <<spinner_async_time_sleep_ex>>,
652652
quando substituímos `await asyncio.sleep(3)` por `time.sleep(3)`:
653653
nenhuma animação.
654654
O fluxo de controle vai passar da `supervisor` para `slow`, e então para `is_prime`.
@@ -872,7 +872,7 @@ Agora vamos estudar a função `main` de _procs.py_ no <<primes_procs_main_ex>>.
872872
include::../code/19-concurrency/primes/procs.py[tags=PRIMES_PROC_MAIN]
873873
----
874874
====
875-
<1> Se nenhum argumento é dado na linha de comando, define o número de processos como o número de núcleos na CPU; caso contrário, cria quantos processos forem passados no primeiro [.keep-together]#argumento.#
875+
<1> Se nenhum argumento é dado na linha de comando, define o número de processos como o número de núcleos na CPU; caso contrário, cria quantos processos forem passados no primeiro argumento.
876876
<2> `jobs` e `results` são as filas descritas no <<primes_procs_top_ex>>.
877877
<3> Inicia `proc` processos para consumir `jobs` e informar `results`.
878878
<4> Recupera e exibe os resultados; `report` está definido em pass:[<img src="callouts/6.png" alt="6"/>].
@@ -916,7 +916,7 @@ Você((("process pools", "varying process numbers"))) poderia tentar rodar _proc
916916
$ python3 procs.py 2
917917
----
918918

919-
...vai iniciar dois subprocessos, produzindo os resultados quase duas vezes mais rápido que _sequential.py_—se a sua máquina tiver uma CPU com pelo menos dois núcleos e não estiver ocupada rodando outros [.keep-together]#programas#.
919+
...vai iniciar dois subprocessos, produzindo os resultados quase duas vezes mais rápido que _sequential.py_—se a sua máquina tiver uma CPU com pelo menos dois núcleos e não estiver ocupada rodando outros programas.
920920

921921
Rodei _procs.py_ 12 vezes, usando de 1 a 20 subprocessos, totalizando 240 execuções. Então calculei a mediana do tempo para todas as execuções com o mesmo número de subprocessos, e desenhei a <<procs_x_time_fig>>.
922922

0 commit comments

Comments
 (0)