代码之家  ›  专栏  ›  技术社区  ›  Nico Schlömer David Maze

mypy不理解函数返回字符串

  •  0
  • Nico Schlömer David Maze  · 技术社区  · 2 年前

    我有一个函数,它返回 str 或指定的回退值( str None ).当给予 str 回退时,该函数保证返回 str 跑步 mypy 然而,在这方面给出了一个错误。

    MWE:

    from typing import Any
    
    
    def f(x: str, fallback: str | None) -> str | None:
        if x.lower() == "yes":
            return "okay"
        return fallback
    
    
    f("no", fallback="").lower()
    
    f.py:10: error: Item "None" of "str | None" has no attribute "lower"  [union-attr]
    

    我怎么能告诉mypy打电话是安全的 lower() 关于函数的返回值?

    3 回复  |  直到 2 年前
        1
  •  2
  •   AKX Bryan Oakley    2 年前
    from typing import overload
    
    
    @overload
    def f(x: str, fallback: str) -> str:
        ...
    
    
    @overload
    def f(x: str, fallback: str | None = None) -> str | None:
        ...
    
    
    def f(x: str, fallback: str | None = None) -> str | None:
        if x.lower() == "yes":
            return "okay"
        return fallback
    
    
    f("no", fallback="").lower()
    f("no").lower()
    
    

    (类型-)检出:

    • f("no", fallback="").lower() 很好(因为传入了回退和字符串)
    • f("no").lower() 仍然说 Item "None" of "str | None" has no attribute "lower"

    当然,如果 fallback 实际上是 None ,这将返回一个 没有一个 ,所以你违背了你的同类所说的小拇指承诺。

        2
  •  0
  •   C.Nivs    2 年前

    您需要调用来解释可能的null结果:

    result = f("no", fallback="")
    
    end = result.lower() if result is not None else result
    
        3
  •  -1
  •   ti7    2 年前

    你可以使用 Optional

    def f(x: str, fallback: Optional[str] = None) -> str | None:
    
    推荐文章