Почему эта функция не аннотирована правильно (ошибка: отсутствуют типовые параметры для универсального типа)? - PullRequest
1 голос
/ 09 марта 2019

Правильно ли аннотирована эта функция?

import subprocess
from os import PathLike
from typing import Union, Sequence, Any


def run(shell_command: Union[bytes, str, Sequence[Union[bytes, str, PathLike]]], **subprocess_run_kwargs: Any) -> int:
    return subprocess.run(shell_command, check=True, shell=True, **subprocess_run_kwargs).returncode

Я предполагаю, что это не так, потому что я получаю:

he\other.py:6: error: Missing type parameters for generic type

Чтобы получитьта же ошибка, затем сохраните указанный выше код в other.py, а затем:

$ pip install mypy

$ mypy --strict other.py

1 Ответ

1 голос
/ 09 марта 2019

PathLike является универсальным типом, поэтому его необходимо использовать с параметром типа (например, AnyStr):

import subprocess
from os import PathLike
from typing import Union, Sequence, Any, AnyStr


def run(shell_command: Union[bytes, str, Sequence[Union[bytes, str, PathLike[AnyStr]]]], **subprocess_run_kwargs: Any) -> int:
    return subprocess.run(shell_command, check=True, shell=True, **subprocess_run_kwargs).returncode

Проблемы, связанные с данной:

ОБНОВЛЕНИЕ

Извините, я не проверял этот код во время выполнения.С некоторыми приемами можно написать обходной путь:

import subprocess
from os import PathLike as BasePathLike
from typing import Union, Sequence, Any, AnyStr, TYPE_CHECKING
import abc


if TYPE_CHECKING:
    PathLike = BasePathLike
else:
    class FakeGenericMeta(abc.ABCMeta):
        def __getitem__(self, item):
            return self

    class PathLike(BasePathLike, metaclass=FakeGenericMeta):
        pass

def run(shell_command: Union[bytes, str, Sequence[Union[bytes, str, PathLike[AnyStr]]]], **subprocess_run_kwargs: Any) -> int:
    return subprocess.run(shell_command, check=True, shell=True, **subprocess_run_kwargs).returncode

Проблемы, связанные с этим обходным путем:

...