You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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`,
276
276
você pode salvar sua configuração favorita da forma descrita na página
277
277
https://fpy.li/8-8[Mypy configuration file] (EN) na documentação do Mypy.
278
278
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:
1137
1137
1138
1138
. Tornar aquele comportamento o default a partir de Python 3.9: `list[str]` agora funciona sem que `future` precise ser importado.
1139
1139
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.
1141
1141
1142
1142
. 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.
Copy file name to clipboardExpand all lines: online/cap14.adoc
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -607,7 +607,7 @@ Originalmente, o Django oferecia uma série de funções, chamadas views genéri
607
607
608
608
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.
609
609
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`.
|[.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
966
966
|`itertools`|`dropwhile(predicate, it)`|Consome `it`, pulando itens enquanto `predicate` resultar verdadeiro, e daí produz todos os elementos restantes (nenhuma verificação adicional é realizada)
967
967
|(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
968
968
|`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
|[.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.
1016
1016
|(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`
1017
1017
|(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
1018
1018
|`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
1128
1128
<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.
1129
1129
<6> O argumento nomeado `fillvalue` especifica um valor de preenchimento customizado.
1130
1130
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`.
<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.
380
380
<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.
381
381
A função `main` ficará bloqueada até que `supervisor` retorne.
382
382
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
554
554
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`.
555
555
* 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`.
556
556
* 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`.
558
558
559
559
Essa comparação ajuda a entender como a concorrência é orquestrada com _asyncio_,
560
560
em contraste com como isso é feito com o módulo `Threading`, possivelmente mais familiar ao leitor.
@@ -619,7 +619,7 @@ ____
619
619
620
620
Antes de executar o código ou continuar lendo,
621
621
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.
623
623
624
624
Agora as respostas, da mais fácil para a mais difícil.
625
625
@@ -648,7 +648,7 @@ Mas se você tiver duas ou mais threads disputando por mais tempo da CPU, seu pr
648
648
===== 3. Resposta para asyncio
649
649
Se((("coroutines", "Global Interpreter Lock impact"))) você chamar `is_prime(5_000_111_000_222_021)` na corrotina `slow` do exemplo _spinner_async.py_,
650
650
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>>,
652
652
quando substituímos `await asyncio.sleep(3)` por `time.sleep(3)`:
653
653
nenhuma animação.
654
654
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>>.
<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.
876
876
<2> `jobs` e `results` são as filas descritas no <<primes_procs_top_ex>>.
877
877
<3> Inicia `proc` processos para consumir `jobs` e informar `results`.
878
878
<4> Recupera e exibe os resultados; `report` está definido em pass:[<img src="callouts/6.png" alt="6"/>].
...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.
920
920
921
921
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>>.
0 commit comments