我经常发现自己的类型与Python中的基类型极其相似,但它们有一些特定的属性,我希望typechecker知道这些属性。你知道吗
例如,我可能有ColorValue = NewType('ColorValue', int)
,其中ColorValue
的范围应该在0到255之间。你知道吗
然后,我想让typechecker告诉我是否与类型规范不匹配。例如,类似于:
red: ColorValue = 300 # value of 300 is not compatible with type ColorValue
理想的情况下,我希望能够设置这样的东西了
ColorValue = NewType('ColorValue', int, check=lambda value: 0 <= value <= 255)
有没有办法让类型检查器检查特定的属性?你知道吗
编辑:
为了清楚起见,我希望这个检查由mypy或pytype这样的类型检查器完成,并且我不希望错误只在运行时发生。
考虑以下模块,称为“限制.py““
另一个模块叫做主.py,您要测试的
从终端运行
python main.py
将打印您不使用
if __name__ == "__main__"
子句保护静态检查将允许您在导入时进行检查。你知道吗古老的答案
您可以在解析时进行检查,例如,假设您有一个名为
restricted.py
的文件,其代码如下:它在导入模块/解析代码时打印
Value 300 is too high in line 13
,例如从bash中,除了mypy restricted.py
之外,还打印python restricted.py
。你知道吗显然,mypy和pytype都没有单独打印消息,因此看起来它们实际上并不导入模块,而是直接解析文件。可以将bash中的类型检查和导入与
tpcheck() { mypy $1 && python $1; }
融合,然后可以调用tpcheck restricted.py
来完成这两项工作。你知道吗只需注意:NewType实际上并不创建新类。正如文档所说:“在运行时,NewType(name,tp)返回一个伪函数,这个伪函数只返回它的参数”。你知道吗
另一种选择是自动生成单元测试,例如使用
auger-python
。例如,当我们将以下代码添加到前面的代码段时:tpcheck还向我显示了输出foo中的错误,即
Value 999 is too high in line 22
。请注意,我展示了一个关于auger的bug,我必须手动修复它(参见https://github.com/laffra/auger/issues/23)。另外,mypy抱怨缺少auger的导入,所以我不得不重新定义tpcheck() { mypy $1 ignore-missing-imports && python3 $1; }
。你知道吗但最终,这归结为调用函数,并在运行时执行它。我看不出你怎么能逃避,但至少你可以尝试尽可能地自动化。你知道吗
相关问题 更多 >
编程相关推荐