【问题标题】:MyPy - Incompatible types in assignment (expression has type None, variable has type X) [duplicate]MyPy - 赋值中的不兼容类型(表达式的类型为无,变量的类型为 X)[重复]
【发布时间】:2021-12-17 04:50:34
【问题描述】:

有人知道为什么 MyPy 会抱怨这个吗?这非常令人沮丧,因为如果它是三元则它可以工作,但如果在标准 if/else 中则不能:

from typing import List, Optional, Union

def get_relevant_params() -> List[str]:
    return sorted(list(set(['1', '2', '3'])))

# also doesn't work with: ... -> Union[List[str], None]
def get_config(config_path: Optional[str] = None) -> Optional[List[str]]:
    
    # this doesn't work
    if config_path:
        read_cols = get_relevant_params()
    else:
        read_cols = None
        
    # # this works
    # read_cols = get_relevant_params() if config_path else None

    return read_cols

这是一个带有示例的交互式 MyPy 游乐场: https://mypy-play.net/?mypy=latest&python=3.8&gist=2c846e569ecbd5f8884367393a754adc

【问题讨论】:

    标签: python python-3.x mypy python-typing typing


    【解决方案1】:

    您没有注释 read_cols,因此 mypy 必须根据对 read_cols 的第一次分配为它添加 infer a type。第一个赋值分配了一个List[str] 类型的值,因此mypy 确定这是read_cols 的类型,而None 不是该类型的有效值。

    如果你想要一个不同的类型,注释你的变量:

    read_cols: Optional[List[str]]
    

    【讨论】:

    • 我不确定你的意思,如果你看一下函数get_relevant_params(),那么它清楚地将返回类型声明为List[str]——但我也一直在拉扯我的头发这已经有一段时间了,所以也许我遗漏了一些东西——你能发布一个可行的解决方案吗?
    • @Zach:我发布了一个可行的解决方案。 ddg也是如此。
    • 您注释了get_relevant_params。你没有注释read_cols
    【解决方案2】:

    将第 11 行改为:

     read_cols: Optional[List[str]] = get_relevant_params()
    

    您的问题是 mypy 将变量 read_cols 的类型自动识别为 List[str],因为这是 get_relevant_params 的返回类型。然后,当您尝试将 None 分配给它时,它会显示“不兼容的类型”。如果您在创建变量时指定您希望它是可选的,那么一切正常。


    也许更简洁的解决方案是避免使用返回变量。

        if config_path:
            return get_relevant_params()
        else:
            return None
    

    这样,config_path 的类型就不会有任何混淆。

    【讨论】:

    • 这是一个简化的问题示例,我实际上只是使用三元,因为它可以工作,但实际代码中的 if/else 语句中还有其他几个赋值。
    • 我明白你的意思,但这似乎是 MyPy 的一个错误,if/else 语句是非常标准的逻辑,应该理解变量可以被分配不同的值......
    • 如果我将line 11 更改为您所写的内容,它确实有效,但这会使代码的可读性大大降低 imo,无论如何,谢谢!
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2022-06-14
    • 1970-01-01
    相关资源
    最近更新 更多