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
Copy file name to clipboardExpand all lines: online/cap17.adoc
+7-4Lines changed: 7 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -401,7 +401,7 @@ StopIteration
401
401
<2> Obtém um iterador a partir de `s3`.
402
402
<3> `next(it)` devolve a próxima palavra.
403
403
<4> Não há mais palavras, então o iterador gera uma exceção `StopIteration`.
404
-
<5> Uma vez exaurido, um itereador irá sempre gerar `StopIteration`, o que faz parecer que ele está vazio..
404
+
<5> Uma vez exaurido, um itereador vai sempre gerar `StopIteration`, o que faz parecer que ele está vazio..
405
405
<6> Para percorrer a sentença novamente é preciso criar um novo iterador.
406
406
407
407
Como os únicos métodos exigidos de um iterador são `+__next__+` e `+__iter__+`, não há como checar se há itens restantes, exceto invocando `next()` e capturando `StopIteration`.
@@ -470,8 +470,11 @@ Iteradores implementam um método `+__next__+`, que devolve itens individuais, e
470
470
471
471
Assim, iteradores também são iteráveis, mas iteráveis não são iteradores.
472
472
473
-
Pode ser tentador implementar `+__next__+` além de `+__iter__+` na classe `Sentence`, tornando cada instância de `Sentence` ao mesmo tempo um iterável e um iterador de si mesma.
474
-
Mas raramente isso é uma boa ideia. Também é um anti-padrão comum, de acordo com Alex Martelli, que possui vasta experiência revisando código no Google.
473
+
Pode ser tentador implementar `+__next__+` além de `+__iter__+` na classe
474
+
`Sentence`, tornando cada instância de `Sentence` ao mesmo tempo um iterável e
475
+
um iterador de si mesma. Mas raramente isso é uma boa ideia. Também é um
476
+
anti-padrão comum, de acordo com Alex Martelli, que tem vasta experiência
477
+
revisando código no Google.
475
478
476
479
A seção "Aplicabilidade" do padrão de projeto _Iterator_ no livro _Padrões de Projeto_ diz:
477
480
@@ -1589,7 +1592,7 @@ BaseException
1589
1592
----
1590
1593
1591
1594
O próximo pequeno passo nos leva ao nível 1.
1592
-
A geradora `tree` irá produzir o nome da classe raiz e os nomes de cada subclasse direta.
1595
+
A geradora `tree` produzirá o nome da classe raiz e os nomes de cada subclasse direta.
1593
1596
Os nomes das subclasses são indentados para explicitar a hierarquia.
<1> `supervisor` irá retornar o resultado de `slow`.
286
+
<1> `supervisor` retornará o resultado de `slow`.
287
287
<2> A instância de `threading.Event` é a chave para coordenar as atividades das threads `main` e `spinner`, como explicado abaixo.
288
288
<3> Para criar uma nova `Thread`, forneça uma função como argumento palavra-chave `target`, e argumentos posicionais para a `target` como uma tupla passada via `args`.
289
289
<4> Mostra o objeto `spinner`. A saída é `<Thread(Thread-1, initial)>`, onde `initial`
Copy file name to clipboardExpand all lines: online/cap22.adoc
+15-8Lines changed: 15 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -124,7 +124,7 @@ o método `keys` é um atributo do `dict` `__data`.
124
124
125
125
Uma instância de `FrozenJSON` contém um atributo de instância privado `+__data+`, armazenado sob o nome `++_FrozenJSON__data++`, como explicado na <<private_protected_sec>>.
126
126
Tentativas de recuperar atributos por outros nomes vão disparar `+__getattr__+`.
127
-
Esse método irá primeiro olhar se o `dict` `+self.__data+` contém um atributo (não uma chave!) com aquele nome; isso permite que instâncias de `FrozenJSON` tratem métodos de `dict` tal como `items`, delegando para `+self.__data.items()+`. Se `+self.__data+` não contiver uma atributo como o `name` dado, `+__getattr__+` usa `name` como chave para recuperar um item de `+self.__data+`, e passa aquele item para `FrozenJSON.build`. Isso permite navegar por estruturas aninhadas nos dados JSON, já que cada mapeamento aninhado é convertido para outra instância de `FrozenJSON` pelo método de classe `build`.
127
+
Primeiro, esse método verá se o `dict` `+self.__data+` contém um atributo (não uma chave!) com aquele nome; isso permite que instâncias de `FrozenJSON` tratem métodos de `dict` tal como `items`, delegando para `+self.__data.items()+`. Se `+self.__data+` não contiver uma atributo como o `name` dado, `+__getattr__+` usa `name` como chave para recuperar um item de `+self.__data+`, e passa aquele item para `FrozenJSON.build`. Isso permite navegar por estruturas aninhadas nos dados JSON, já que cada mapeamento aninhado é convertido para outra instância de `FrozenJSON` pelo método de classe `build`.
128
128
129
129
Observe que `FrozenJSON` não transforma ou armazena o conjunto de dados original.
130
130
Conforme navegamos pelos dados, `+__getattr__+` cria continuamente instâncias de `FrozenJSON`.
do `+__dict__+` da instância, para evitar uma chamada recursiva à propriedade `speakers`.
471
471
<2> Devolve uma lista de todos os registros com chaves correspondendo aos números em `spkr_serials`.
472
472
473
-
Dentro do método `speakers`, tentar ler `self.speakers` irá invocar a própria propriedade, gerando rapidamente um `RecursionError`.
474
-
Entretanto, se lemos os mesmos dados via `+self.__dict__['speakers']+`, o algoritmo normal de Python para busca e recuperação de atributos é ignorado, a propriedade não é chamada e a recursão é evitada.
475
-
Por essa razão, ler ou escrever dados diretamente no `+__dict__+` de um objeto é um truque comum em metaprogramação no Python.
473
+
Dentro do método `speakers`, uma tentativa de ler `self.speakers` invocará a
474
+
mesma propriedade, gerando rapidamente um `RecursionError`. Entretanto,
475
+
acessando via `+self.__dict__['speakers']+`, evitamos o algoritmo de Python para
476
+
busca de atributos, a propriedade não é chamada e evitamos a recursão. Por esta
477
+
razão, ler ou escrever dados diretamente no `+__dict__+` de um objeto é um
478
+
truque comum em metaprogramação no Python.
476
479
477
480
[WARNING]
478
481
====
479
-
O interpretador avalia `+obj.my_attr+` olhando primeiro a classe de `obj`.
480
-
Se a classe possuir uma propriedade de nome `my_attr`, aquela propriedade oculta um atributo de instância com o mesmo nome.
481
-
Isso será demonstrado por exemplos na <<prop_override_instance>>,
482
-
e o <<ch_descriptors>> vai revelar que uma propriedade é implementada como um descritor—uma abstração mais geral e poderosa.
482
+
483
+
O interpretador avalia `+obj.my_attr+` olhando primeiro a classe de `obj`. Se a
484
+
classe tiver uma propriedade de nome `my_attr`, aquela propriedade oculta um
485
+
atributo de instância com o mesmo nome. Isso será demonstrado por exemplos na
486
+
<<prop_override_instance>>, e o <<ch_descriptors>> vai revelar que uma
487
+
propriedade é implementada como um descritor—uma abstração mais geral e
488
+
poderosa.
489
+
483
490
====
484
491
485
492
Quando programava a compreensão de lista no <<ex_schedule_v3_speakers>>, meu cérebro réptil de programador pensou: "Isso talvez seja custoso". Na verdade não é, porque os eventos no conjuntos de dados da OSCON contêm poucos palestrantes, então programar algo mais complexo seria uma otimização prematura.
0 commit comments