我一直在将类型信息添加到我的包的.py
文件中,以支持对包的运行mypy
。除此之外,允许为此第三方包生成typeshed信息。在不依赖打字模块的情况下添加类型信息
由于我的包必须是Python 2.7版兼容,我用注释的类型信息:
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上运行该软件包)。这使得我的软件包依赖于
typing
进行2.7/3.3/3.4安装,需要额外的下载和安装。我有我自己的
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
时执行? 根据环境变量进行测试也可以让我把我自己的类型的定义放在“守护”的范围内。
或其他一些解决方案?