Pelo que eu sei, Python é uma linguagem de digitação gradual. E todas as variáveis não anotadas são do tipo Any
que é um supertipo e subtipo de qualquer tipo. Por que então o código a seguir foi rejeitado pelo verificador de tipo estático?
def doubles(x: str) -> str:
return x + x
y = True
doubles(y)
Entendo que o programa está obviamente incorreto, mas como o verificador de tipo adivinhou? Não deveria acontecer o seguinte:
y
não é anotado, portanto é do tipo Qualquer- lançar
Any
parastr
- aceite o programa
O comportamento esperado ocorre somente se você especificar explicitamente o Any
tipo. Eu presumiria que, sem especificar explicitamente Any
, y
seria atribuído o tipo da expressão correta, ou seja, bool
, mas não seríamos capazes de alterar o valor de y
para 123
type int
, o que não é verdade
O sistema de verificação de tipo estático também "examinará" os valores realmente atribuídos no código-fonte. E irá, de fato, adotar o tipo de valores atribuídos às variáveis não anotadas.
No seu exemplo, ele "vê" exatamente como podemos fazer,
y
contém um arquivobool
. E mesmo quey
fosse anotado como sendobool | str
, veria que o valor real contido neste caso é um bool. (Mas na verdade reclama do tipo mais amplo).Além disso, não permitirá que valores simplesmente "mais amplos" caibam em chamadas anotadas mais restritas: mesmo se você anotar
y
como "qualquer", busque seu valor em tempo de execução de algum lugar que o sistema de digitação estática não possa "ver", ele irá poderia avisá-lo com tal chamada:doubles
requer umstr
parâmetro (mas na verdade permite, pelo menos mypy).