проблемы с пониманием поведения str () в mypy с флагом --py2 - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть кусок кода

1. b = u'\xe6' #type: unicode
2. c = str(b) #type: str
3. d = c #type: str

Я запускаю это с флагом python 2 в mypy.

Я ожидаю, что в строке 2 должна быть ошибка. Str (b) возвращает тип unicode , а c имеет ожидаемый тип str , поэтому должна быть проблема несовместимости типов. Но никаких ошибок не выдается.

С другой стороны, если я явно сделаю

1. b = u'\xe6' #type: unicode
2. c = str(b) #type: unicode
3. d = c #type: str

Тогда в строке 3 возникает ошибка, утверждающая, что не может присвоить юникод str, что несколько ожидаемо.

Так что проблема в моем понимании str (), разве str () не должен возвращать тот же тип, что и его ввод? или он неявно приводит все к str, если да, то не должно быть ошибки в строке 2 вместо строки 3 во втором примере.

Из текущего поведения str () принимает тип переменной, которой она назначается.

1 Ответ

1 голос
/ 17 апреля 2020

str возвращает объект типа str. При редких и необычных обстоятельствах он может возвращать экземпляр подкласса str, но он определенно не возвращает объект любого типа, который вы передали.

Строка 2 проходит проверку типа во фрагменте 2, потому что У mypy есть специфика c особый случай , который говорит, что str совместим с unicode на Python 2, но не наоборот.

...