gpt4 book ai didi

python - 为什么变量的类型提示不作为函数参数的类型提示处理?

转载 作者:行者123 更新时间:2023-12-04 10:44:22 29 4
gpt4 key购买 nike

在 Python 中编写具有如下类型提示的函数时:

def foo(token: Token=None):
pass
它转换为这种类型提示: Optional[Token] .带可选,一个 None值(value)也被接受。

为类字段编写相同的类型提示时,它的行为不一样:
class bar:
foo: Token = None
在这里输入提示检查器,就​​像 PyCharm 报告中的集成器一样:

Expected type 'Token', got None instead.


我的问题是:
  • 为什么在参数case中提示和None隐式组合到 Optional[...] ?
  • 为什么字段的行为不同,而具有相同的语法?

  • 我使用 PyCharm 2019.3。

    最佳答案

    Why is in the parameter case the hint and None implicitly combined to Optional[...]


    这就是 PyCharm 的静态类型检查器在参数默认值设置为 None 时推断参数类型的方式。 .它推断类型为 Optional[type]你所声明的。对于签名之外的变量声明,此推理规则的应用方式有所不同。

    Why do fields behave differently, while having the same syntax?


    根据我们从以下来源获得的理解,这是一个语法细节选择,旨在使签名更加简洁,尽管引入了隐式规则。
    PyCharm 的静态类型检查器的实现方式与历史 PEP 484 更改保持一致。当前版本指出:

    Union types - PEP 484

    A past version of this PEP allowed type checkers to assume an optional type when the default value is None, as in this code:

    def handle_employee(e: Employee = None): ...

    This would have been treated as equivalent to:

    def handle_employee(e: Optional[Employee] = None) -> None: ...

    This is no longer the recommended behavior. Type checkers should move towards requiring the optional type to be made explicit.


    查看修订历史 "PEP 484: Do not require type checkers to treat a None default special…"原因在 Pull request #689 中给出链接回 typing issue #275 .
    我修改了你的代码,因为 Token未定义,到:
    def foo(token: int = None) -> None:
    pass

    class bar:
    foo: int = None
    将 mypy 静态类型检查器与 default configurations 一起使用警告按预期发出:
    error: Incompatible default for argument "token" (default has type "None", argument has type "int")
    error: Incompatible types in assignment (expression has type "None", variable has type "int")
    我没有找到任何 PyCharm inspection有一个可配置的选项。

    关于python - 为什么变量的类型提示不作为函数参数的类型提示处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59777841/

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