据我所知,Python是一种渐进式打字语言.所有未注释的变量都是Any类型,它是任何类型的超类型和子类型.那么为什么静态类型判断器会拒绝下面的代码呢?

def doubles(x: str) -> str:
     return x + x


y = True
doubles(y)

我知道这个程序显然是不正确的,但类型判断器是如何猜到的?难道不应该发生以下情况:

  1. y未加批注,因此它的类型为Any
  2. 选角Any %到str%
  3. 接受方案

仅当您显式指定Any类型时,才会出现预期行为.我假设如果不显式指定Any,y将被分配正确表达式的类型,即bool,但随后我们将不能将y的值更改为123 类型int,这不是真的

推荐答案

静态类型判断系统还将"查看"源代码中的实际赋值.并且实际上将采用为未注释变量赋值的类型.

在您的示例中,它"看到"就像我们可以做的那样,y包含bool.即使y被注释为bool | str,它也会看到本例中包含的actual值是布尔值.(但它实际上抱怨的是更广泛的类型).

此外,它不允许简单的"更广泛"的值适合更窄的注释调用:即使你将y注释为"any",在运行时从静态类型系统无法"看到"的地方获取它的值,它也会用这样的调用警告你:doubles需要一个str参数(但它实际上允许它,至少mypy).

Python相关问答推荐

Python 3.12中的通用[T]类方法隐式类型检索

运行回文查找器代码时发生错误:[类型错误:builtin_index_or_system对象不可订阅]

用合并列替换现有列并重命名

C#使用程序从Python中执行Exec文件

为什么默认情况下所有Python类都是可调用的?

利用Selenium和Beautiful Soup实现Web抓取JavaScript表

字符串合并语法在哪里记录

在matplotlib中删除子图之间的间隙_mosaic

matplotlib + python foor loop

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

需要帮助使用Python中的Google的People API更新联系人的多个字段'

获取git修订版中每个文件的最后修改时间的最有效方法是什么?

python3中np. divide(x,y)和x/y有什么区别?'

是否需要依赖反转来确保呼叫方和被呼叫方之间的分离?

如何在Polars中将列表中的新列添加到现有的数据帧中?

Pandas:使列中的列表大小与另一列中的列表大小相同

#将多条一维曲线计算成其二维数组(图像)表示

如何使用Polars从AWS S3读取镶木地板文件

Python:使用asyncio.StreamReader.readline()读取长行