gpt4 book ai didi

python - 添加类型信息而不依赖于 typing 模块

转载 作者:行者123 更新时间:2023-11-28 21:42:34 27 4
gpt4 key购买 nike

我一直在将类型信息添加到我的包的 .py 文件中,以支持对包运行 mypy。除其他外,允许生成 typeshed此第三方包的信息。

因为我的包必须与 Python 2.7 兼容,所以我使用注释来获取类型信息:

def __init__(self, s):
# type: (Text) -> None

但是为了运行 mypy 这需要我输入类型:

from typing import Text, IO, BinaryIO, Union

这会导致两个问题:

  1. 这不适用于 Python 3.5.0 和 3.5.1,因为它有一个模块 typing 但不包括 Text。安装 typing来自 PyPI 并不能解决这个问题。 (并且有用户在该版本的 Python 上运行该包)。

  2. 这使我的包依赖于 typing对于 2.7/3.3/3.4 安装,需要额外的下载和安装。

  3. 我定义了自己的 Union 类型:

    StreamType = Union[BinaryIO, IO[str], StringIO]
    StreamTextType = Union[Text, StreamType]

    此代码必须根据输入是否可用有条件地执行。

对于第一个问题,由于我没有在 Python 3.5.0/1 下运行 mypy,我可以这样做:

import sys
if sys.version_info < (3, 5, 0) and sys.version_info >= (3, 5, 2):
from typing import Text, IO, BinaryIO, Union

但这并没有解决第二个问题。

注释掉import,比如注释中的类型信息,

# from typing import Text, IO, BinaryIO, Union

将导致 mypy 抛出错误 Name 'Text' is not defined

第三个问题可以通过使用try-except(丑陋的,也可能是低效的)或例如通过针对环境变量进行测试(也可用于解决第一个问题)。

运行 mypy 时是否设置了一个环境变量,我可以对其进行测试,以便仅在运行 mypy 时执行 import 语句?针对环境变量进行测试还允许我将我自己的类型的定义放在“ protected ”中。

还是其他一些解决方案?

最佳答案

mypy 关联的唯一环境变量是 MYPYPATH,它由包的代码读取,而不是由它设置。尽管可能会设置 MYPYPATH(尤其是在生成 typeshed 信息时,以提供“其他”类型信息),但不能保证它就是这样。

您不能注释掉 import 语句,但您可以将它放在一个永远不会执行的 block 中:

if False:  # MYPY
from typing import Text, IO, BinaryIO, Union

这样做的好处是您不必导入 os 来获取环境变量(和/或 sys 来获取 version_info) 如果您在特定的 Python 文件中没有其他需要。

你的类型定义也应该像这样指定,并且可以在所有使用的类型被导入或定义之后出现在任何地方:

# import or define StringIO

if False: # MYPY
StreamType = Union[BinaryIO, IO[str], StringIO]
StreamTextType = Union[Text, StreamType]

如果以上内容在 mytypes.py 中,您的包中的任何其他源文件,在任何类型定义中使用 StreamTypeText,应该:

if False:  # MYPY
from typing import Text, IO, BinaryIO, Union
from .mytypes StreamType

以上将满足 mypy,因此它不会在未定义 Text 时抛出错误。它还将在 3.5.0/1 上运行,并且无需使您的包依赖于 typing

如果您要在 Python 2.7 环境中运行 mypy,您可能仍然需要安装 typing,但您的普通包的用户不会受此影响。

请注意,我在每个 block 的 if 之后添加了注释 # MYPY。为 from typing 搜索文件很容易,但是如果 mypy 改变了它的行为并且你的代码需要调整。

关于python - 添加类型信息而不依赖于 typing 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43516780/

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