gpt4 book ai didi

python - "sys.version_info"的类型是什么?

转载 作者:行者123 更新时间:2023-12-01 00:35:01 31 4
gpt4 key购买 nike

如何向以下函数添加类型注释?

import sys

def f(info):
return info.major

f(sys.version_info)

使用pyannotate表明它应该是:

import sys

def f(info):
# type: (sys.version_info) -> int
return info.major

f(sys.version_info)

但是 mypy 提示:

$ mypy test.py
test.py:10: error: Variable "sys.version_info" is not valid as a type
test.py:12: error: sys.version_info? has no attribute "major"```

sys.version_info 的类型似乎是它本身:

>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>

它看起来像一个NamedTuple,但如果它是这样注释的:

from typing import NamedTuple

VersionInfo = NamedTuple(
'sys.version_info', [
('major', int),
('minor', int),
('micro', int),
('releaselevel', str),
('serial', int)
]
)

import sys

def f(info):
# type: (VersionInfo) -> int
return info.major

f(sys.version_info)

mypy 检查仍然失败:

$ mypy test.py
test.py:25: error: Argument 1 to "f" has incompatible type "_version_info"; expected "sys.version_info@9"

最佳答案

为了找到某些标准库函数的类型,您应该查看 Typeshed ,标准库的类型提示存储库 + 选择第 3 方模块。

在这种情况下,我们可以看到sys.version_infoannotated as being of type sys._version_info ,这是一个假的、合成的纯类型类,它是 Tuple[int, int, int, str, int] 的子类。 .

您还可以通过针对以下程序运行 mypy 来亲自验证这一点:

import sys
reveal_type(sys.version_info)

这会产生以下输出 - 请注意最后的回退:

 Revealed type is 'Tuple[builtins.int, builtins.int, builtins.int, builtins.str, builtins.int, fallback=sys._version_info]'
<小时/>

因此,要注释您的函数,您有多种选择。首先,您可以使用这个仅进行类型检查的类——您只需要确保永远不会在运行时导入/引用它。

如果您使用类型注释语法(例如 # type: (sys._version_info) -> int ),这个问题已经为您解决了。毕竟,注释中的代码片段永远不会在运行时评估。

但是如果您想使用 Python-3 样式类型注释,您可以这样做:

from __future__ import annotations
import sys

def f(info: sys._version_info) -> int:
return info.major

f(sys.version_info)

__future__ import 基本上使上面的程序与下面的程序等效 - 所有类型提示都被视为字符串,因此不需要在运行时进行评估:

import sys

def f(info: "sys._version_info") -> int:
return info.major

f(sys.version_info)

或者,如果您想显式导入不带 sys 的类型,您也可以这样做模块命名空间:

from __future__ import annotations
from typing import TYPE_CHECKING
import sys

# Doing just 'if False:' also works
if TYPE_CHECKING:
from sys import _version_info as VersionInfo

def f(info: VersionInfo) -> int:
return info.major

f(sys.version_info)

关于python - "sys.version_info"的类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57862106/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com