【问题标题】:How to type hint with walrus operator?如何使用海象运算符输入提示?
【发布时间】:2021-06-03 20:06:00
【问题描述】:

我正在尝试输入提示海象运算符表达式,即

while (var: int := some_func()): ...

我该怎么做?

【问题讨论】:

    标签: python walrus-operator


    【解决方案1】:

    这是不可能的。来自PEP 572

    不支持内联类型注解:

    你需要在while循环之前声明变量,你可以在那里指定类型。

    var: int
    while var := some_func():
        ...
    

    【讨论】:

    • = 0 有必要吗?看来var: int 就足够了。
    • 如果不使用整数初始化,则需要var: Optional[int],这样才不会违反类型。
    • 有趣。 var: int 实际上并没有创建var,所以它永远不会有None 的值。为什么会违反类型?
    • 我只是按照 PEP 所说的去做。它建议var: Optional[int] = None
    • 我认为不需要Optional 提示;这只是一个例子。单独var: int 应该没问题,只要保证some_func 返回int
    【解决方案2】:

    我不相信你可以。

    一个变量可以被注释,因为赋值的语法规则是

    assignment:
        | NAME ':' expression ['=' annotated_rhs ] 
    
        ...
    

    请注意,类型提示在名称后面的 := 之间是显式的。

    另一方面,赋值表达式:=之前提供名称,没有类型提示:

    named_expression:
        | NAME ':=' ~ expression 
        | expression !':='
    

    【讨论】:

    • 这似乎是一个疏忽?我希望这个运算符可以通过正确的输入来实现
    • 故意限制 Python 的语法,以便它可以被 LL(1) 解析器解析。我对细节很模糊(自从我研究解析器以来已经 很长时间 了),但我认为像 if x: int := f(y): 这样的东西不能用 LL(1) 语法来表达;判断x 后面的: 是否引入类型提示或完成条件所需的前瞻对LL(1) 解析器根本不可用。 Python 现在使用 PEG 解析器,我认为它更加灵活,但 := 早于新解析器的引入。
    猜你喜欢
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2022-07-01
    • 2020-02-19
    相关资源
    最近更新 更多