mypy Reveal_type 的单元测试

问题描述 投票:0回答:2

我在遗留代码(python 库:music21)中有一些要点,它使用大量重载和通用变量来显示/类型检查 t.Sequence 中的所有子元素都属于特定类型。 有很多

@overload
装饰器来展示不同的属性如何返回不同的值。此时,功能可以正常工作,但过去的一些 PR 已经打破了其他开发人员所需的内省。

代码经过了广泛的测试,但 mypy 和 PyCharm 等检查器推断的类型并未经过测试。 有没有办法对推断类型进行测试? 比如:

SomeClassType = typing.TypeVar('SomeClassType', bound='SomeClass')

class SomeClass:
    pass

class DerivedClass(SomeClass):
    pass

class MyIter(typing.Sequence[typing.Type[SomeClassType]]):
    def __init__(self, classType: typing.Type[SomeClassType]):
        self.classType = classType

# ------- type_checks.py...
derived_iterator = MyIter(DerivedClass)

# this is the line that I don't know exists...
typing_utilities.assert_reveal_type_eq(derived_iterator, 
                                       MyIter[DerivedClass])
# or as a string 'MyIter[DerivedClass]'

mypy 的

reveal_type
似乎在这里会有帮助,但我似乎找不到任何与测试系统的集成等。谢谢!

pycharm mypy python-typing
2个回答
5
投票

您要找的功能确实存在。但叫法不同:

首先,定义类型测试:

from typing_extensions import assert_type

def function_to_test() -> int:
    pass


# this is a positive test: we want the return type to be int
assert_type(function_to_test(), int)

# this is a negative test: we don't want the return type to be str
assert_type(function_to_test(), str)  # type: ignore

然后在文件上运行 mypy:

mypy --strict --warn-unused-ignores

失败的正面测试仅报告为 mypy 错误,失败的负面测试报告为“未使用的“类型:忽略”注释”。

软件包

typing_extensions
与 mypy 一起安装。

来源:https://typing.readthedocs.io/en/latest/source/quality.html


1
投票

您的问题很具体,接受的答案就是这样。但我想展示一些额外的工具来解决总体问题:“如何逐渐将静态类型添加到现有的代码库中?”

  1. beartype - 这会将类型注释转变为运行时检查。这很有用 - 现在非类型化代码可以调用类型化代码,它要么提前失败,要么告诉您一切正常

  2. monkeytype - 这将检测代码并记录代码实际运行中使用的类型。这些发现存储在一个文件中,monkeytype 可以使用这些知识自动向代码添加类型提示,反映它之前看到的内容。

© www.soinside.com 2019 - 2024. All rights reserved.