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: capitulos/cap07.adoc
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -482,7 +482,7 @@ def factorial(n):
482
482
====
483
483
484
484
Outro grupo de "++lambda++s de um só truque" que `operator` substitui são funções para extrair itens de sequências ou para ler atributos de objetos:
485
-
`itemgetter` e `attrgetter` são fábricas que criam funções personalizadas para fazer exatamente isso.
485
+
`itemgetter` e `attrgetter` são fábricas que criam funções customizadas para fazer exatamente isso.
486
486
487
487
O <<itemgetter_demo>> mostra um uso frequente de `itemgetter`: ordenar uma lista de tuplas pelo valor de um campo.
488
488
No exemplo, as cidades são exibidas por ordem de código de país (campo 1).
@@ -699,7 +699,7 @@ functools.partial(<function tag at 0x10206d1e0>, 'img', class_='pic-frame') <4>
699
699
A função `functools.partialmethod` faz o mesmo que `partial`, mas foi projetada para trabalhar com métodos.
700
700
701
701
O módulo `functools` também inclui funções de ordem superior para serem usadas como decoradores de função, tais como `cache` e `singledispatch`, entre outras.
702
-
Essas funções são tratadas no <<ch_closure_decorator>>, que também explica como implementar decoradores personalizados.((("", startref="FAFfp07")))((("", startref="fprogpack07")))((("", startref="functools07")))
702
+
Essas funções são tratadas no <<ch_closure_decorator>>, que também explica como implementar decoradores customizados.((("", startref="FAFfp07")))((("", startref="fprogpack07")))((("", startref="functools07")))
Copy file name to clipboardExpand all lines: capitulos/cap09.adoc
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -915,7 +915,7 @@ As últimas duas funções no <<singledispatch_ex>> ilustram a sintaxe que funci
915
915
916
916
917
917
[[singledispatch_ex]]
918
-
.`@singledispatch` cria uma `@htmlize.register` personalizada, para empacotar várias funções em uma função genérica
918
+
.`@singledispatch` cria uma `@htmlize.register` customizada, para empacotar várias funções em uma função genérica
919
919
====
920
920
[source, py]
921
921
----
@@ -1011,7 +1011,7 @@ https://fpy.li/9-3[números inteiros e de ponto flutuante] (EN) em formatos volt
1011
1011
Usar ABCs ou `typing.Protocol` com `@singledispatch` permite que seu código suporte classes existentes ou futuras que sejam subclasses reais ou virtuais daquelas ABCs, ou que implementem aqueles protocolos. O uso de ABCs e o conceito de uma subclasse virtual são assuntos do <<ch_ifaces_prot_abc>>.
1012
1012
====
1013
1013
1014
-
Uma qualidade notável do mecanismo de `singledispatch` é que você pode registrar funções especializadas em qualquer lugar do sistema, em qualquer módulo. Se mais tarde você adicionar um módulo com um novo tipo definido pelo usuário, é fácil acrescentar uma nova função específica para tratar aquele tipo. E é possível também escrever funções personalizadas para classes que você não escreveu e não pode modificar.
1014
+
Uma qualidade notável do mecanismo de `singledispatch` é que você pode registrar funções especializadas em qualquer lugar do sistema, em qualquer módulo. Se mais tarde você adicionar um módulo com um novo tipo definido pelo usuário, é fácil acrescentar uma nova função específica para tratar aquele tipo. E é possível também escrever funções customizadas para classes que você não escreveu e não pode modificar.
1015
1015
1016
1016
O `singledispatch` foi uma adição muito bem pensada à biblioteca padrão, e oferece muitos outros recursos que não me cabe descrever aqui. Uma boa referência é a https://fpy.li/pep443[PEP 443--Single-dispatch generic functions] (EN) mas ela não menciona o uso de dicas de tipo, acrescentado posteriormente. A documentação do módulo `functools` foi aperfeiçoada e oferece um tratamento mais atualizado, com vários exemplos na seção referente ao https://docs.python.org/pt-br/3/library/functools.html#functools.singledispatch[`singledispatch`] (EN).
Copy file name to clipboardExpand all lines: capitulos/cap11.adoc
+6-6Lines changed: 6 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -301,12 +301,12 @@ O <<ex_format_t1>> implementa `+__format__+` para produzir as formatações vist
301
301
<1> Usa a função embutida `format` para aplicar o `fmt_spec` a cada componente do vetor, criando um iterável de strings formatadas.
302
302
<2> Insere as strings formatadas na fórmula `'(x, y)'`.
303
303
304
-
Agora vamos acrescentar um código de formatação personalizado à nossa mini-linguagem: se o especificador de formato terminar com `'p'`, vamos exibir o vetor em coordenadas polares: `<r, θ>`,
304
+
Agora vamos acrescentar um código de formatação customizado à nossa mini-linguagem: se o especificador de formato terminar com `'p'`, vamos exibir o vetor em coordenadas polares: `<r, θ>`,
305
305
onde `r` é a magnitute e θ (theta) é o ângulo em radianos. O restante do especificador de formato (o que quer que venha antes do `'p'`) será usado como antes.
306
306
307
307
[TIP]
308
308
====
309
-
Ao escolher a letra para um código personalizado de formato, evitei sobrescrever códigos usados por outros tipos. Na https://docs.python.org/pt-br/3/library/string.html#formatspec[Mini-Linguagem de Especificação de Formato] vemos que inteiros usam os códigos `'bcdoxXn'`, `floats` usam `'eEfFgGn%'` e strings usam `'s'`. Então escolhi `'p'` para coordenadas polares. Como cada classe interpreta esses códigos de forma independente, reutilizar uma letra em um formato personalizado para um novo tipo não é um erro, mas pode ser confuso para os usuários.
309
+
Ao escolher a letra para um código customizado de formato, evitei sobrescrever códigos usados por outros tipos. Na https://docs.python.org/pt-br/3/library/string.html#formatspec[Mini-Linguagem de Especificação de Formato] vemos que inteiros usam os códigos `'bcdoxXn'`, `floats` usam `'eEfFgGn%'` e strings usam `'s'`. Então escolhi `'p'` para coordenadas polares. Como cada classe interpreta esses códigos de forma independente, reutilizar uma letra em um formato customizado para um novo tipo não é um erro, mas pode ser confuso para os usuários.
310
310
====
311
311
312
312
Para gerar coordenadas polares, já temos o método `+__abs__+` para a magnitude. Vamos então escrever um método `angle` simples, usando a função `math.atan2()`, para obter o ângulo. Eis o código:
@@ -742,7 +742,7 @@ O último tópico do capítulo trata da sobreposição de um atributo de classe
742
742
743
743
Um((("Pythonic objects", "overriding class attributes", id="POoverride11")))((("attributes", "overriding class attributes", id="Aover11"))) recurso característico de Python é a forma como atributos de classe podem ser usados como valores default para atributos de instância. `Vector2d` contém o atributo de classe `typecode`. Ele é usado duas vezes no método `+__bytes__+`, mas é lido intencionalmente como `self.typecode`. As instâncias de `Vector2d` são criadas sem um atributo `typecode` próprio, então `self.typecode` vai, por default, se referir ao atributo de classe `Vector2d.typecode`.
744
744
745
-
Mas se incluirmos um atributo de instância que não existe, estamos criando um novo atributo de instância—por exemplo, um atributo de instância `typecode`—e o atributo de classe com o mesmo nome permanece intocado. Entretanto, daí em diante, sempre que algum código referente àquela instância contiver `self.typecode`, o `typecode` da instância será usado, na prática escondendo o atributo de classe de mesmo nome. Isso abre a possibilidade de personalizar uma instância individual com um `typecode` diferente.
745
+
Mas se incluirmos um atributo de instância que não existe, estamos criando um novo atributo de instância—por exemplo, um atributo de instância `typecode`—e o atributo de classe com o mesmo nome permanece intocado. Entretanto, daí em diante, sempre que algum código referente àquela instância contiver `self.typecode`, o `typecode` da instância será usado, na prática escondendo o atributo de classe de mesmo nome. Isso abre a possibilidade de customizar uma instância individual com um `typecode` diferente.
746
746
747
747
O `Vector2d.typecode` default é `'d'`: isso significa que cada componente do vetor será representado como um número de ponto flutuante de dupla precisão e 8 bytes de tamanho quando for exportado para `bytes`. Se definirmos o `typecode` de uma instância `Vector2d` como `'f'` antes da exportação, cada componente será exportado como um número de ponto flutuante de precisão simples e 4 bytes de tamanho.. O <<typecode_instance_demo>> demonstra isso.
748
748
@@ -787,7 +787,7 @@ Para modificar um atributo de classe, é preciso redefini-lo diretamente na clas
787
787
----
788
788
>>> Vector2d.typecode = 'f'
789
789
----
790
-
Porém, no Python, há uma maneira idiomática de obter um efeito mais permanente, e de ser mais explícito sobre a modificação. Como atributos de classe são públicos, eles são herdados por subclasses. Então é uma prática comum fazer a subclasse personalizar um atributo da classe. As views baseadas em classes do Django usam amplamente essa técnica. O <<typecode_subclass_demo>> mostra como se faz.
790
+
Porém, no Python, há uma maneira idiomática de obter um efeito mais permanente, e de ser mais explícito sobre a modificação. Como atributos de classe são públicos, eles são herdados por subclasses. Então é uma prática comum fazer a subclasse customizar um atributo da classe. As views baseadas em classes do Django usam amplamente essa técnica. O <<typecode_subclass_demo>> mostra como se faz.
791
791
792
792
[[typecode_subclass_demo]]
793
793
.O `ShortVector2d` é uma subclasse de `Vector2d`, que apenas sobrepõe o `typecode` default
@@ -823,7 +823,7 @@ Esse exemplo também explica porque não escrevi explicitamente o `class_name` e
823
823
824
824
Se eu tivesse escrito o `class_name` explicitamente, subclasses de `Vector2d` como `ShortVector2d` teriam que sobrescrever `+__repr__+` só para mudar o `class_name`. Lendo o nome do `type` da instância, tornei `+__repr__+` mais seguro de ser herdado.
825
825
826
-
Aqui termina nossa conversa sobre a criação de uma classe simples, que se vale do modelo de dados para se adaptar bem ao restante de Python: oferecendo diferentes representações do objeto, fornecendo um código de formatação personalizado, expondo atributos somente para leitura e suportando `hash()` para se integrar a conjuntos e mapeamentos.((("", startref="Aover11")))((("", startref="POoverride11")))
826
+
Aqui termina nossa conversa sobre a criação de uma classe simples, que se vale do modelo de dados para se adaptar bem ao restante de Python: oferecendo diferentes representações do objeto, fornecendo um código de formatação customizado, expondo atributos somente para leitura e suportando `hash()` para se integrar a conjuntos e mapeamentos.((("", startref="Aover11")))((("", startref="POoverride11")))
827
827
828
828
829
829
=== Resumo do capítulo
@@ -872,7 +872,7 @@ ____
872
872
873
873
Este((("Pythonic objects", "further reading on"))) capítulo tratou de vários dos métodos especiais do modelo de dados, então naturalmente as referências primárias são as mesmas do <<ch_data_model>>, onde tivemos uma ideia geral do mesmo tópico. Por conveniência, vou repetir aquelas quatro recomendações anteriores aqui, e acrescentar algumas outras:
874
874
875
-
O https://docs.python.org/pt-br/3/reference/datamodel.html[capítulo "Modelo de Dados"] em _A Referência da Linguagem Python_:: A maioria dos métodos usados nesse capítulo estão documentados em https://docs.python.org/pt-br/3/reference/datamodel.html#basic-customization["3.3.1. Personalização básica"].
875
+
O https://docs.python.org/pt-br/3/reference/datamodel.html[capítulo "Modelo de Dados"] em _A Referência da Linguagem Python_:: A maioria dos métodos usados nesse capítulo estão documentados em https://docs.python.org/pt-br/3/reference/datamodel.html#basic-customization["3.3.1. Customização básica"].
876
876
877
877
pass:[<a class="orm:hideurl" href="https://fpy.li/pynut3"><em>Python in a Nutshell</em>, 3ª ed.,</a>] de Alex Martelli, Anna Ravenscroft, e Steve Holden:: Trata com profundidade dos métodos especiais .
0 commit comments