2

在 Python 3 中,类型提示允许mypy等第三方工具检查类型;但是,我发现类型检查语法与程序注释一起有点难看。使用 mypy 可以将存根函数和方法放入与.pyi文件相同的目录中的单独文件中.py.pyi是否可以在文件的等效文件中定义所有类型相关的语法.py?因此,例如,您可以.pyi使用所有类型语法在文件中定义变量、方法、返回类型等,但不理会主.py代码?

4

1 回答 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 回答