gpt4 book ai didi

python - 是否可以将 Python 中的所有类型提示/检查基础结构分离到 .pyi 文件中?

转载 作者:行者123 更新时间:2023-11-30 22:26:02 26 4
gpt4 key购买 nike

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

最佳答案

不是真的。虽然 PEP 484 确实指定您可以创建自定义 pyi 文件,这些文件最终充当现有模块的“公共(public)接口(interface)”,以便代码的任何用户受益,但它没有指定获取这些 pyi 文件和 < em>在内部类型检查相应的 py 文件。

事实上,如果一个目录同时包含 py 和 pyi 文件,则 py 文件将被完全忽略。

mypy issue tracker 上有对此的开放功能请求,但对我来说这似乎是一个低优先级的任务,因为即使实现了该功能,您最终也只能使用 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

由于我们实际上确实需要调用我们构建的幻影新类型/可以在正则表达式中混合和混合这些幻影调用,因此不清楚我们如何将此模块表示为 stub 。

还有其他几种类型功能也很难在 stub 中表示 - 例如强制转换、NamedTuple、TypedDict 等。

关于python - 是否可以将 Python 中的所有类型提示/检查基础结构分离到 .pyi 文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47350570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com