Python 3 中可以结合参数描述和类型提示吗?

问题描述 投票:0回答:2

在 Python 3 中,您可以向函数参数添加描述:

def foo(host: 'ip address for connection')
    cool_stuff()

您还可以提供预期的类型,稍后可以使用

mypy
:

检查
def foo(host: str)
    cool_stuff()

两者在我看来都非常有用 - 有没有一种方法可以将两者结合起来,并且仍然能够让

mypy
检查一致性?

python python-3.x arguments type-hinting mypy
2个回答
6
投票

不,这就是编写

PEP 484
的部分原因,以提供函数注释、类型提示的清晰且唯一的用途。

特别是在有关现有用途的部分,它指出:

一行论点指出 PEP 3107 明确支持在函数注释中使用任意表达式。新提案被认为与 PEP 3107 的规范不兼容。

并继续说明:

我们确实希望类型提示最终成为注释的唯一用途,但这需要额外的讨论,并且在首次使用 Python 推出类型模块后需要一段弃用期。

考虑了同时指定两者的替代方案,但由于代码可读性降低而明显被拒绝:

尽管有所有这些选项,但已经有人提出了允许类型提示和其他形式的注释对于各个参数共存的提案。一项提案建议,如果给定参数的注释是字典文字,则每个键代表不同形式的注释,并且键

'type'
将用于类型提示。 这个想法及其变体的问题在于符号变得非常“嘈杂”并且难以阅读。

同时允许两者也会违背本 PEP 的要点,并使注释的使用变得支离破碎。最后,您最好的选择是使用良好的文档字符串来记录参数,并坚持仅使用函数注释来进行类型提示。


0
投票

过去接受的答案是正确的,但现在有

Annotated
,首先通过PEP 593引入到3.9:

# 3.9+
from typing import Annotated
# 3.8 and older
from typing_extensions import Annotated

def foo(host: Annotated[str, 'ip address for connection'])
    cool_stuff()

此机制被 Pydantic 等大量使用。

© www.soinside.com 2019 - 2024. All rights reserved.