修复 mypy 错误 - 赋值中的类型不兼容(表达式的类型为“xxx”,变量的类型为“yyy”)

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

我遇到了以下

mypy
错误,并且不知道如何修复它。

test.py:30: error: Incompatible types in assignment (expression has type "list[str] | list[Path]", variable has type "list[Path]")  [assignment]

代码版本:

Python 3.10.13
mypy 1.9.0 (compiled: yes)

我尝试了here接受的答案中的选项1和2,但这没有任何作用。

这是代码:

import re
import glob
from pathlib import Path
from typing import Sequence


def find_files(files: str | Sequence[str], sort: bool = True) -> list[str] | list[Path]:
    """Find files based on shell-style wildcards.
    
    files = '/path/to/all/*.csv'

    files = [
        '/path/to/all/*.csv',
        '/and/to/all/*.xlsx
    ]
    """

    # Convert to list if input is a str.
    files = [files] if isinstance(files, str) else files

    # Find files.
    found_files = [Path(fglob).resolve()
                   for f in files
                   for fglob in glob.glob(f, recursive=True)]

    # Make sure no duplicates exist.
    found_files = [*set(found_files)]

    if sort:
        found_files = sort_nicely(found_files) # TODO: mypy complains here

    return found_files


def sort_nicely(lst: Sequence[str] | Sequence[Path] ) -> list[str] | list[Path]:
    """Perform natural human sort.
    
    sort_nicely(['P1', 'P10', 'P2']) == ['P1', 'P2', 'P10'] 
    """

    def convert(text: str) -> str | int:
        return int(text) if text.isdigit() else text

    def alpha_key(item: str | Path) -> list[str | int]:
        return [convert(c) for c in re.split('([0-9]+)', str(item))]

    return sorted(lst, key=alpha_key)
python mypy
1个回答
1
投票

您需要更好地描述您的

sort_nicely
函数的类型,如下所示:

from typing import TypeVar
T = TypeVar("T", bound=str|Path)
def sort_nicely(lst: Sequence[T] ) -> list[T]:
    ...

您的签名所说的是“函数可能采用 str 或 Path 序列并返回 str 或 Path 列表”。这意味着“函数可能采用 str 或 Path 序列并返回相同内容的列表”。

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