在 Python 3 中,类型提示允许mypy等第三方工具检查类型;但是,我发现类型检查语法与程序注释一起有点难看。使用 mypy 可以将存根函数和方法放入与.pyi
文件相同的目录中的单独文件中.py
。.pyi
是否可以在文件的等效文件中定义所有类型相关的语法.py
?因此,例如,您可以.pyi
使用所有类型语法在文件中定义变量、方法、返回类型等,但不理会主.py
代码?
问问题
848 次
1 回答
3
并不真地。虽然 PEP 484 确实指定您可以创建自定义 pyi 文件,这些文件最终充当现有模块的“公共接口”,以使您的代码的任何用户受益,但它没有指定获取这些 pyi 文件和内部的方法typecheck对应的py文件。
事实上,如果一个目录同时包含 py 和 pyi 文件,那么 py 文件将被完全忽略。
在mypy 问题跟踪器上有一个开放的功能请求,但对我来说这似乎是一种低优先级的任务,因为即使实现了该功能,您最终也只能使用 Python 类型系统的一个子集。
例如,假设我们想使用像NewType这样的东西来编写一些代码来模板化 HTML 或其他东西:
from pathlib import Path
from typing import NewType
UnsanitizedText = NewType('UnsanitizedText', str)
CleanHtml = NewType('CleanHtml', str)
HtmlTemplate = NewType('HtmlTemplate', str)
def get_user_input() -> UnsanitizedText:
# code omitted
def escape_to_html(raw: UnsanitizedText) -> CleanHtml:
# perform checks on 'raw', do escaping logic, etc
return CleanHtml(cleaned_string)
def load_template(path: Path) -> HtmlTemplate:
return HtmlTemplate(path.read_text())
def render_template(template: HtmlTemplate, *kwargs: CleanHtml) -> CleanHtml:
# code omitted
t = load_template(Path("foo/bar.html"))
dirty = get_user_input()
clean = escape_to_html(dirty)
print(render_template(t, arg=dirty)) # Does not typecheck
print(render_template(t, arg=clean)) # Typechecks
由于我们确实需要调用我们构造的幻象新类型/可以在正则表达式中混合和混合这些幻象调用,因此不清楚我们如何将此模块表示为存根。
还有一些其他类型的特征也很难在存根中表示——比如 casts、NamedTuple、TypedDict 等。
于 2017-11-18T21:26:52.330 回答