Почему эта функция Python не выдает ошибку, если значение Enum не совпадает? - PullRequest
1 голос
/ 06 мая 2020

Если у меня есть функция python со следующим определенным color аргументом:

def search(
    self,
    color: ColorEnum = None
) -> Result:

И ColorEnum выглядит так:

class ColorEnum(str, Enum):
    Red = "red",
    Green = "green",
    Blue = "blue"

Почему Python не выдает ошибку, когда я делаю следующее:

search(color="black")

Используется ли значение Enum только во время компиляции? Похоже, что во время выполнения не действует, и функция будет работать

1 Ответ

2 голосов
/ 06 мая 2020

Аннотации к функциям - это просто «примечания», которые вы можете прикрепить к параметрам функции и типу возвращаемого значения. Они не действуют во время выполнения, хотя вы можете получить доступ к им.

>>> def foo(x: int) -> str: pass
...
>>> foo.__annotations__
{'x': <class 'int'>, 'return': <class 'str'>}

Если вы выбрали to, вы можете использовать их для реализации своей собственной проверки типов. code:

def foo(x: int) -> str:
    if not isinstance(x, foo.__annotations__('x')):
        raise ValueError("x is not the right type")
    rv = str(x)
    if not isinstance(rv, foo.__annotations__('return')):
        raise ValueError("wrong return type")
    return rv

Это, конечно, легко победить, и вероятность появления ошибок столь же велика, как и для их обнаружения.

Подсказки типа предоставляют документацию («Вы должны передайте int в качестве аргумента, и вы должны вернуть str значение. ") И средство проверки типов stati c для выявления очевидных ошибок. Учитывая чистое определение

def foo(x: int) -> str:
    return str(x)

, такой инструмент, как mypy, может пометить следующий код как ошибку без необходимости выполнить код:

foo("nine")  # "nine" does not have type int
3 + foo(5)   # foo returns a str, but you can't add int and str values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...