@wintreist

Почему VS Code не распознает, что функция вернет tuple?

class MAC:
        def __init__(self):
            pass

        @overload
        @classmethod
        def get_mac_address(cls, with_gateway: bool = False) -> str:
            ...
        @overload
        @classmethod
        def get_mac_address(cls, with_gateway: bool = True) -> tuple[str, str]:
            ...
        @classmethod
        def get_mac_address(cls, with_gateway: bool = False) -> str:
            default_gateway = netifaces.gateways()["default"][netifaces.AF_INET][1]
            mac_addr = netifaces.ifaddresses(default_gateway)[netifaces.AF_LINK][0]['addr']
            return mac_addr if not with_gateway else (mac_addr, default_gateway)

Есть функция, описанная выше, хочу описать её так, чтобы если with_gateway=True, то функция вернет typle[str, str], если with_gateway=False, то - str
Почему-то vs code видит, что от разных условий вернется разное:
66df30f97cbac177908938.png
66df30ffbb1c4995861565.png
66df310c30271212312677.png
Но если я ввожу with_gateway=True, то статический анализатор считает, что в переменную запишется str:
66df316908b71984635492.png
Если поменять перегрузки местами, то всегда показывает, что возвращается tuple[str, str]
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Потому что оба оверлоада неразличимы - они ОБА показывают один аргумент типа bool.
И да, а если аргумент не указан, что вернёт функция? Из твоего кода это неясно вообще, так как у тебя два противоречащих варианта.
Тебе надо что-то типа...
@overload
@classmethod
def get_mac_address(cls, with_gateway: typing.Literal[False] = False) -> str:
    ...
@overload
@classmethod
def get_mac_address(cls, with_gateway: typing.Literal[True]) -> tuple[str, str]:
    ...
@classmethod
def get_mac_address(cls, with_gateway: bool = False) -> typing.Union[str, tuple[str, str]]:
    ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы