Skip to content

Commit c0b9e7c

Browse files
committed
cap15: paginação
1 parent 7e01a5d commit c0b9e7c

File tree

6 files changed

+91
-72
lines changed

6 files changed

+91
-72
lines changed

code/15-more-types/cafeteria/covariant.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ class OrangeJuice(Juice):
1616
# tag::BEVERAGE_TYPES[]
1717
T_co = TypeVar('T_co', covariant=True) # <1>
1818

19-
2019
class BeverageDispenser(Generic[T_co]): # <2>
2120
def __init__(self, beverage: T_co) -> None:
2221
self.beverage = beverage
@@ -33,7 +32,6 @@ def install(dispenser: BeverageDispenser[Juice]) -> None: # <3>
3332
# tag::INSTALL_JUICE_DISPENSERS[]
3433
juice_dispenser = BeverageDispenser(Juice())
3534
install(juice_dispenser)
36-
3735
orange_juice_dispenser = BeverageDispenser(OrangeJuice())
3836
install(orange_juice_dispenser)
3937
# end::INSTALL_JUICE_DISPENSERS[]

online/cap14.adoc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,8 +1454,7 @@ https://fpy.li/14-51[_The End Of Object Inheritance & The Beginning Of A New Mod
14541454
na PyCon 2013. Fackler e Manista falam sobre organizar sistemas em torno de
14551455
interfaces e das funções que lidam com os objetos que implementam aquelas
14561456
interfaces, evitando o acoplamento forte e os pontos de falha de classes e da
1457-
herança. Isso me lembrou muito a maneira de pensar do Go, mas aqui os autores a
1458-
defendem para Python.
1457+
herança. É o modo de pensar da comunidade Go, aplicado ao Python.
14591458

14601459
.Soapbox
14611460
****

online/cap15.adoc

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1920,9 +1920,11 @@ Algumas vezes essa é a única solução com custo-benefício positivo.
19201920
19211921
**Notação de variância em outras linguagens**
19221922
1923+
**Notação de variância em outras linguagens**
1924+
19231925
A variância((("Soapbox sidebars", "variance notation in other languages")))((("variance",
19241926
"variance notation in other languages"))) é um tópico complicado,
1925-
e a sintaxe das dicas de tipo de Python não é tão boa quanto poderia ser.
1927+
e a sintaxe das dicas de tipo de Python deixa a desejar.
19261928
Esta citação direta da PEP 484 evidencia isso:
19271929
19281930
[quote]
@@ -1939,12 +1941,23 @@ ____
19391941
Se esse é o caso, por que a covariância e a contravarância são declaradas com
19401942
`TypeVar` e não na classe genérica?
19411943
1942-
Os autores da PEP 484 trabalharam sob a severa restrição auto-imposta de
1943-
suportar dicas de tipo sem fazer qualquer modificação no interpretador. Isso
1944-
exigiu a introdução de `TypeVar` para definir variáveis de tipo, e também levou
1945-
ao abuso de `[]` para fornecer a sintaxe `Klass[T]` para genéricos—em vez da
1944+
Os autores da PEP 484 optaram por introduzir dicas de tipo sem fazer
1945+
qualquer modificação no interpretador.
1946+
Em Python, todo identificador aparece pela primeira vez no código-fonte
1947+
de um módulo através de uma
1948+
atribuição, ou uma instrução especial como `import`, `class`, ou `def`.
1949+
Por isso tiveram que criar `TypeVar` para declarar uma variável de tipo
1950+
através de uma atribuição:
1951+
1952+
[source, python]
1953+
----
1954+
T = TypeVar('T')
1955+
----
1956+
1957+
Para não mexer no _parser_, reutilizaram o operador `[]` na sintaxe
1958+
`Klass[T]` para genéricos—em vez da
19461959
notação `Klass<T>` usada em outras linguagens populares, incluindo C#, Java,
1947-
Kotlin e TypeScript. Nenhuma dessas linguagens exige que variáveis de tipo seja
1960+
Kotlin e TypeScript. Estas linguagens não exigem que variáveis de tipo sejam
19481961
declaradas antes de serem usadas.
19491962
19501963
Além disso, a sintaxe do Kotlin e do C# torna claro se um parâmetro de tipo é
@@ -1961,9 +1974,7 @@ class BeverageDispenser<out T> {
19611974
----
19621975
19631976
O modificador `out` no parâmetro de tipo formal significa que `T` é um tipo de
1964-
_output_ (saída)), e portanto `BeverageDispenser` é covariante.
1965-
1966-
[role="pagebreak-before less_space"]
1977+
_output_ (saída), e portanto `BeverageDispenser` é covariante.
19671978
Você provavelmente consegue adivinhar como `TrashCan` seria declarada:
19681979
19691980
[source, kotlin]
@@ -1974,15 +1985,13 @@ class TrashCan<in T> {
19741985
----
19751986
19761987
Dado `T` como um parâmetro de tipo formal de _input_ (entrada),
1977-
segue que `TrashCan` é contravariante.
1978-
1988+
então `TrashCan` é contravariante.
19791989
Se nem `in` nem `out` aparecem, então a classe é invariante naquele parâmetro.
19801990
1981-
É fácil lembrar das <<variance_rules_sec>> quando `out` e `in` são usado nos
1982-
parâmetros de tipo formais.
1983-
1984-
Isso sugere que uma boa convenção para nomenclatura de variáveis de tipo
1985-
covariante e contravariantes no Python seria:
1991+
É fácil lembrar das regras gerais de variância (<<variance_rules_sec>>)
1992+
quando `out` e `in` são usados nos parâmetros de tipo formais.
1993+
Isso sugere uma convenção melhor para nomear de variáveis de tipo
1994+
covariantes e contravariantes:
19861995
19871996
[source, python]
19881997
----
@@ -2001,7 +2010,7 @@ class TrashCan(Generic[T_in]):
20012010
...
20022011
----
20032012
2004-
Será que é tarde demais para modificar a convenção de nomenclatura definida na
2005-
PEP 484?
2013+
Será tarde demais para adotar `T_out` e `T_in` em vez de
2014+
`T_co` e `T_contra` que foram sugeridos na PEP 484?
20062015
20072016
****

vol2/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ e faço as demais tarefas nestas cópias especiais para impressão.
1515
|||||||||`/vol2`| refazer referências entre volumes|
1616
|||||||||`/vol2`| encurtar links entre volumes |
1717
|||||||||`/vol2`| exibir capítulo alvo em xrefs para exemplos de outros capítulos |
18-
||||||| | |`/vol2`| rever paginação |
18+
||||||| | |`/vol2`| rever paginação |
1919

vol2/cap14.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,8 +1469,7 @@ https://fpy.li/14-51[_The End Of Object Inheritance & The Beginning Of A New Mod
14691469
na PyCon 2013. Fackler e Manista falam sobre organizar sistemas em torno de
14701470
interfaces e das funções que lidam com os objetos que implementam aquelas
14711471
interfaces, evitando o acoplamento forte e os pontos de falha de classes e da
1472-
herança. Isso me lembrou muito a maneira de pensar do Go, mas aqui os autores a
1473-
defendem para Python.
1472+
herança. É o modo de pensar da comunidade Go, aplicado ao Python.
14741473

14751474
.Soapbox
14761475
****
@@ -1578,6 +1577,7 @@ envolvida, e está claro que uma mixin em Ruby não influencia o tipo da classe
15781577
onde que a utiliza. Isto oferece os benefícios das mixins, evitando muitos de
15791578
seus problemas mais comuns.
15801579
1580+
<<<
15811581
Duas novas linguagens orientadas a objetos que estão recebendo muita atenção
15821582
limitam severamente a herança: Go e Julia. Ambas giram em torno de programar
15831583
"objetos" implementando "métodos", e suportam https://fpy.li/7b[«polimorfismo»],

0 commit comments

Comments
 (0)