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: volumes/1/cap01.adoc
+26-12Lines changed: 26 additions & 12 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -82,7 +82,10 @@ Aprendi a dizer "dunder-getitem" com o autor e professor Steve Holden.
82
82
"Dunder" é uma contração da frase em inglês "double underscore before and after"
83
83
(_sublinhado duplo antes e depois_).
84
84
Por isso os métodos especiais são também conhecidos como _métodos dunder_.
85
-
O capítulo https://docs.python.org/pt-br/3/reference/lexical_analysis.html#reserved-classes-of-identifiers["Análise Léxica"] de _A Referência da Linguagem Python_ adverte que "_Qualquer_ uso de nomes no formato `+__*__+` que não siga explicitamente o uso documentado, em qualquer contexto, está sujeito a quebra sem aviso prévio."
pois é uma introdução ao Modelo de Dados de Python, que é muito estável.
93
96
As mudanças mais significativas foram:
94
97
95
-
* Métodos especiais que suportam programação assíncrona e outras novas funcionalidades foram acrescentados às tabelas em <<overview_special_methods>>.
98
+
* Novos métodos especiais que suportam programação assíncrona e
99
+
outras novas funcionalidades nas tabelas em <<overview_special_methods>>.
96
100
97
-
* A <<collection_uml>>, mostrando o uso de métodos especiais em <<collection_api>>, incluindo a classe base abstrata `collections.abc.Collection`, introduzida n Python 3.6.
101
+
* A <<collection_uml>>, mostrando o uso de métodos especiais em <<collection_api>>,
102
+
incluindo a classe base abstrata `collections.abc.Collection`, introduzida n Python 3.6.
98
103
99
104
Além disso, aqui((("f-string syntax", "benefits of"))) e por toda essa segunda edição,
100
105
adotei a sintaxe _f-string_, introduzida n Python 3.6,
@@ -578,7 +583,7 @@ mostrando como elas são criadas a partir de métodos especiais.
578
583
579
584
[role="width-70"]
580
585
[[collection_uml]]
581
-
.Diagrama de classes UML com os tipos fundamentais de coleções. Métodos como nome em _itálico_ são abstratos,então precisam ser implementados pelas subclasses concretas, tais como `list` e `dict`. O restante dos métodos tem implementações concretas, então as subclasses podem herdá-los.
586
+
.Diagrama de classes UML com os tipos fundamentais de coleções. Métodos como nome em _itálico_ são abstratos,então precisam ser implementados pelas subclasses concretas, tais como `list` e `dict`. O restante dos métodos tem implementações concretas, então as subclasses podem herdá-los.
582
587
image::../images/flpy_0102.png[Diagram de classes UML com todas as superclasses e algumas subclasses de `abc.Collection`]
583
588
584
589
Cada uma das ABCs no topo da hierarquia tem um único método especial.
@@ -660,7 +665,9 @@ I tried to use keep-together in <<special_operators_tbl>> but it was rendering a
660
665
Operadores infixos e numéricos são suportados pelos métodos especiais listados na
Aqui os nomes mais recentes são `+__matmul__+`, `+__rmatmul__+`, e `+__imatmul__+`, adicionados n Python 3.5 para suportar o uso de `@` como um operador infixo de multiplicação de matrizes, como veremos no _{ch_op_overload}_.((("special methods", "special method names and symbols for operators")))
668
+
Aqui os nomes mais recentes são `+__matmul__+`, `+__rmatmul__+`, e `+__imatmul__+`,
669
+
adicionados n Python 3.5 para suportar o uso de `@` como um operador infixo de multiplicação de matrizes,
670
+
como veremos no _{ch_op_overload}_.((("special methods", "special method names and symbols for operators")))
664
671
665
672
[[special_operators_tbl]]
666
673
.Nomes e símbolos de métodos especiais para operadores
@@ -679,7 +686,8 @@ Aqui os nomes mais recentes são `+__matmul__+`, `+__rmatmul__+`, e `+__imatmul_
679
686
680
687
[NOTE]
681
688
====
682
-
Python invoca um método especial de operador reverso no segundo argumento quando o método especial correspondente não pode ser usado no primeiro operando.
689
+
Python invoca um método especial de operador reverso no segundo argumento quando
690
+
o método especial correspondente não pode ser usado no primeiro operando.
683
691
Atribuições aumentadas são atalho combinando um operador infixo com uma atribuição de variável, por exemplo `a += b`.
684
692
685
693
O _{ch_op_overload}_ explica em detalhes os operadores reversos e a atribuição aumentada.((("", startref="PDMspmtov01")))
@@ -690,23 +698,29 @@ O _{ch_op_overload}_ explica em detalhes os operadores reversos e a atribuição
690
698
691
699
Em 2013, fiz((("Python Data Model", "making len work with custom objects")))((("__len__")))
692
700
essa pergunta a Raymond Hettinger, um dos desenvolvedores principais do Python,
693
-
e o núcleo de sua resposta era uma citação do https://fpy.li/1-8["The Zen of Python" (_O Zen do Python_)] (EN): "a praticidade vence a pureza."
701
+
e o núcleo de sua resposta era uma citação do https://fpy.li/1-8["The Zen of Python" (_O Zen do Python_)]
702
+
(EN): "a praticidade vence a pureza."
694
703
Na <<how_special_used>>, descrevi como `len(x)` roda muito rápido quando `x` é uma instância de um tipo embutido.
695
704
Nenhum método é chamado para os objetos embutidos do CPython: o tamanho é simplesmente lido de um campo em uma struct C.
696
-
Obter o número de itens em uma coleção é uma operação comum, e precisa funcionar de forma eficiente para tipos tão básicos e diferentes como
705
+
Obter o número de itens em uma coleção é uma operação comum,
706
+
e precisa funcionar de forma eficiente para tipos tão básicos e diferentes como
697
707
`str`, `list`, `memoryview`, e assim por diante.
698
708
699
-
Em outras palavras, `len` não é chamado como um método porque recebe um tratamento especial como parte do Modelo de Dados de Python, da mesma forma que `abs`.
709
+
Em outras palavras, `len` não é chamado como um método porque recebe um tratamento especial como parte do Modelo de Dados de Python,
710
+
da mesma forma que `abs`.
700
711
Mas graças ao método especial pass:[<code>__len__</code>], também é possível fazer `len` funcionar com nossos objetos personalizados.
701
712
Isso é um compromisso justo entre a necessidade de objetos embutidos eficientes e a consistência da linguagem.
702
713
Também de "O Zen de Python": "Casos especiais não são especiais o bastante para quebrar as regras."
703
714
704
715
705
716
[NOTE]
706
717
====
707
-
Pensar em `abs` e `len` como operadores unários nos deixa mais inclinados a perdoar seus aspectos funcionais, contrários à sintaxe de chamada de método que esperaríamos em uma linguagem orientada a objetos.
708
-
De fato, a linguagem ABC—uma ancestral direta de Python, que antecipou muitas das funcionalidades desta última—tinha o operador `#`, que era o equivalente de `len` (se escrevia `#s`).
709
-
Quando usado como operador infixo, `x#s` contava as ocorrências de `x` em `s`, que em Python obtemos com `s.count(x)`, para qualquer sequência `s`.
718
+
Pensar em `abs` e `len` como operadores unários nos deixa mais inclinados a perdoar seus aspectos funcionais,
719
+
contrários à sintaxe de chamada de método que esperaríamos em uma linguagem orientada a objetos.
720
+
De fato, a linguagem ABC—uma ancestral direta de Python, que antecipou muitas das funcionalidades desta última—tinha o operador `#`,
721
+
que era o equivalente de `len` (se escrevia `#s`).
722
+
Quando usado como operador infixo, `x#s` contava as ocorrências de `x` em `s`,
723
+
que em Python obtemos com `s.count(x)`, para qualquer sequência `s`.
0 commit comments