Комментарии 34
Не, ну понятно — вещи то в принципе полезные, но читаемость кода, которой питон славился, уходит в небытие. А жаль.
Мне кажется это не так критично из-за необязательности тайпхинтинга. По-прежнему в учебных целях можно показывать новичкам простой лаконичный прозрачный код, а те, кого уже не испугать расширенным синтаксисом, могут насладиться большей надёжностью и уверенностью, что где-то не закралась ошибочка.
Новичкам труднее читать чужой код? Да, но, мне кажется, это не большая цена за спокойствие.
Python++
Интересно, когда в популярных IDE начнут появляться режимы сокрытия типизации в коде?
Вжух! — и код снова чист и прозрачен, но при этом мы продолжаем получать ворнинги в случае подозрительных махинаций с типами.
Правда поддерживать актуальность этих файлов несколько сложнее, т.к. надо не забывать вносить в них правки при изменении кода.
Literal какая-то невероятно странная хрень. Это типа попытка замутить арифметику в условном Compile Time, как в плюсах? Иначе мне не очень понятно, чем Literal лучше константы внутри метода?
Нет, ни в коем случае это не арифметика. Это скорее "енумы" + дополнительная возможность параметризовать шаблонные функции.
Например, взяв Literal
+overload
мы можем сделать функцию, которая в завимости от значения параметра возвращает разный тип: функция open
возвращает класс работающий с байтами если режим содержит букву 'b' или со строками, в противном случае (пример из PEP):
# Note: this is a simplification of the true type signature.
_PathType = Union[str, bytes, int]
@overload
def open(path: _PathType,
mode: Literal["r", "w", "a", "x", "r+", "w+", "a+", "x+"],
) -> IO[Text]: ...
@overload
def open(path: _PathType,
mode: Literal["rb", "wb", "ab", "xb", "r+b", "w+b", "a+b", "x+b"],
) -> IO[bytes]: ...
# Fallback overload for when the user isn't using literal types
@overload
def open(path: _PathType, mode: str) -> IO[Any]: ...
Final
Так, глядишь, и настоящих констант дождёмся.
Так, глядишь, и настоящих констант дождёмся.
Ну джавы в python уже почти дождались.
А я бы не отказался от (я не про синтаксис):
@throw(ValueError)
def foo(arg: int) -> str:
pass
Можете попробовать глянуть dry-python/returns. Но лично мне оно не зашло в том виде, в котором предлагается
# Handle a matched regex
if (match := pattern.search(data)) is not None:
# Do something with match
# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]
# Share a subexpression between a comprehension filter clause and its output
filt_data = [y for x in data if (y := f(x)) is not None]
Например, Literal[42] означает, что ожидается в качестве значения ожидается только 42.
Новинки аннотаций типов в Python 3.8 (Protocol, Final, TypedDict, Literal)