我遇到了以下
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)
您需要更好地描述您的
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 序列并返回相同内容的列表”。