@@ -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+
19231925A 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 .
19261928Esta citação direta da PEP 484 evidencia isso:
19271929
19281930[quote]
@@ -1939,12 +1941,23 @@ ____
19391941Se 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
19461959notaçã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
19481961declaradas antes de serem usadas.
19491962
19501963Alé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
19631976O 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.
19671978Você provavelmente consegue adivinhar como `TrashCan` seria declarada:
19681979
19691980[source, kotlin]
@@ -1974,15 +1985,13 @@ class TrashCan<in T> {
19741985----
19751986
19761987Dado `T` como um parâmetro de tipo formal de _input_ (entrada),
1977- segue que `TrashCan` é contravariante.
1978-
1988+ então `TrashCan` é contravariante.
19791989Se 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****
0 commit comments