Неожиданное необязательное поведение с типизацией Python3 и mypy

Я новичок в использовании typing и mypy.

В приведенном ниже блоке кода mypy жалуется, что ret не может быть назначен None, потому что Incompatible types in assignment (expression has type "None", variable has type "Tuple[Connection, Cursor]") (python-mypy).

    def __connect__(self) -> Tuple[Optional[Tuple[Conn, Cursor]], Status]:
        """Establish DB connection."""
        if self.db_type is DB_Type.SQLITE:
            conn = sqlite3.connect(self.db_name)
            cur = conn.cursor()
            ret, status = (conn, cur), Status(Code.OK)
        else:
            ret, status = None, self.INVALID_STATUS    # mypy error 
        return ret, status

Но я определяю сигнатуру возвращаемого типа как Optional[Tuple[Connection, Cursor] вместо Tuple[Connection, Cursor]. Так что либо я что-то упускаю, либо есть ограничение в mypy статическом анализе, для которого, вероятно, есть какое-то обходное решение ... указатели очень ценятся.


person THK    schedule 02.02.2021    source источник
comment
Не удалось воссоздать ошибку. попробуйте внести небольшие изменения в код и перезапустите mypy, иногда старые ошибки не исчезают.   -  person Carl Kristensen    schedule 02.02.2021
comment
PS мои версии - Python 3.9.1 и mypy 0.800   -  person THK    schedule 02.02.2021


Ответы (1)


mypy работает с нетипизированными переменными, используя тип первого присваивания в качестве типа переменной. Таким образом, наличие двух назначений одной и той же нетипизированной переменной с разными типами считается несоответствием типов. Например:

$ cat test.py 
foo, bar = 1, 2
foo, bar = None, 2
$ mypy test.py 
test.py:2: error: Incompatible types in assignment (expression has type "None", variable has type "int")  [assignment]
Found 1 error in 1 file (checked 1 source file)

Та же проблема возникает в вашем коде, хотя она менее очевидна: ret назначается тип Tuple[Connection, Cursor], но другая ветвь присваивает None ret. Тип возврата не имеет значения.

Один из способов обхода - установить тип ясности ret: Optional[Tuple[Connection, Cursor]].

person l0b0    schedule 03.02.2021
comment
В этом есть смысл, спасибо! Мне нужно будет больше узнать об анализе типов mypy, я вижу, что он немного отличается от чисто функционального контекста, поскольку есть побочные эффекты, которые следует учитывать. - person THK; 03.02.2021