Это похоже на ограничение pyright.
Короче говоря, tempfile.TemporaryDirectory
class набирается , чтобы быть обобщенным c относительно AnyStr. Однако в вашем примере кода не указывается тип generi c, а средство проверки типов остается на своем усмотрении.
В этом случае я думаю, что для проверки типов есть несколько разумных вещей:
- Выберите некоторый тип по умолчанию универсального c на основе typevar, такой как 'str' или 'Union [str, bytes]'. Например, mypy заканчивает тем, что по умолчанию выбирает «str», давая «tmpfolder» тип «str».
- Выберите некоторый тип заполнителя, например «Any», тип Dynami c или NoReturn ( ака «снизу» ака «ничего»). Оба типа являются допустимыми подтипами каждого типа, поэтому гарантированно являются допустимыми заполнителями и не вызывают последующих ошибок. Это то, что делают pyre и pytype - они выводят, что 'tmpfolder' имеет тип 'Any' и 'nothing' соответственно.
- Попытка вывести правильный тип на основе контекста. Некоторые средства проверки типов могут пытаться сделать это, но я не знаю ни одного, который бы прекрасно справлялся с этим конкретным случаем.
- Сообщите об ошибке и попросите пользователя указать требуемый тип generi c.
Вместо этого pyright, похоже, просто «утечка» переменной generi c. Возможно, есть принципиальная причина, по которой Pyright решает сделать это, но я пропускаю это, но IMO это похоже на ошибку.
Чтобы ответить на другие ваши вопросы, ваша программа-пример - idiomati c Python, и средства проверки типов должны в идеале поддерживать его без изменений.
Добавление комментария # type: ignore
к строке с ошибкой - это санкционированный PEP 484 способ подавления сообщений об ошибках. Я не достаточно знаком с Pyright, чтобы знать, есть ли у него другой предпочтительный способ подавления ошибок.