【发布时间】:2017-09-16 22:13:06
【问题描述】:
我一直在向我的包的 .py 文件添加类型信息,以支持针对包运行 mypy。除此之外,还允许为此、第三方、包生成typeshed 信息。
由于我的包必须与 Python 2.7 兼容,因此我使用 cmets 作为类型信息:
def __init__(self, s):
# type: (Text) -> None
但为了运行mypy,这需要我导入输入:
from typing import Text, IO, BinaryIO, Union
这会导致两个问题:
这不适用于 Python 3.5.0 和 3.5.1,因为它有一个模块
typing,但不包括Text。从 PyPI 安装typing并不能解决这个问题。 (并且有用户在那个版本的 Python 上运行包)。这使我的包在 2.7/3.3/3.4 安装时依赖于
typing,需要额外的下载和安装。-
我定义了自己的
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,就像在cmets中的类型信息,
# from typing import Text, IO, BinaryIO, Union
将导致mypy 抛出错误Name 'Text' is not defined。
第三个问题可以通过使用try-except(丑陋,而且可能效率低下)或例如通过针对环境变量进行测试(也可以用来解决第一个问题)。
在运行mypy 时是否设置了一个我可以测试的环境变量,以便只在运行mypy 时执行导入语句?
针对环境变量进行测试还可以让我将自己的类型定义放在“受保护的”范围内。
或者其他解决方案?
【问题讨论】:
标签: python type-hinting mypy typeshed