我在遗留代码(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
似乎在这里会有帮助,但我似乎找不到任何与测试系统的集成等。谢谢!
您要找的功能确实存在。但叫法不同:
首先,定义类型测试:
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
您的问题很具体,接受的答案就是这样。但我想展示一些额外的工具来解决总体问题:“如何逐渐将静态类型添加到现有的代码库中?”
beartype - 这会将类型注释转变为运行时检查。这很有用 - 现在非类型化代码可以调用类型化代码,它要么提前失败,要么告诉您一切正常
monkeytype - 这将检测代码并记录代码实际运行中使用的类型。这些发现存储在一个文件中,monkeytype 可以使用这些知识自动向代码添加类型提示,反映它之前看到的内容。