Из документации я понял, что называется это Ellipsis, но что оно такое и для чего использовать - не могу понять.
Пытался найти информацию в интернете, но все что находил - это в лучшем случае вольная интерпретация документации.
Буду благодарен за разъяснение для чего в этом примере используется ...
Вообще обычно это заглушка. Но это уникальное значение (как None), и его можно использовать для своих целей, при желании.
Например, в numpy он используется так: если у нас есть массив с 3 измерениями, и мы хотим задать срез по третьему измерению, мы можем записать либо так array[:, :, 0] либо так array[..., 0].
По-моему, еще в typing есть применения.
Все равно не понимаю. Это просто "заглушка" именно в документации и я не должен использовать это в коде?
Тогда почему такой вариант все равно работает?
ovitebs, работает, потому-что это конструкция языка (в некоторым смысле аналог pass).
В примере из вопроса это будет значить что-то вроде:
Здесь должен быть запрос, но мне сейчас некогда этим заниматься, но в будущем нужно будет его дописать
Немного другой пример:
Вы работаете в коллективе из нескольких человек и далеко не всегда можете общаться в реальном времени. Вам нужно написать условную функцию, которая как-то должна взаимодействовать с данными юзера. Как именно - не важно, но допустим, что если юзер найден - происходит какое-то сложное действие, а если нет - возвращается соответствующее сообщение:
def do_some_work_with_user(username:str) -> str:
user = fetch_user_from_db(user) # Условная функция, находящяя в бд юзера по его нику
if user:
# Здесь какая-то функция
else:
return f'Пользователь {username} не найден'
Вот написали вы каркас функции и отвлеклись (позвонил кто-то, в туалет захотелось и т.д.), ну или конкретно сейчас появилась более приоритетная задача (найти баг и т.д.) В таком виде функция крашнется, а скорее всего и весь проект (над которым, я напомню - работают несколько человек)
Поэтому правильно будет написать так:
def do_some_work_with_user(username:str) -> str:
user = fetch_user_from_db(user) # Условная функция, находящяя в бд юзера по его нику
if user:
...
else:
return f'Пользователь {username} не найден'
Это и с точки зрения синтаксиса верно, и читающие (вы или кто-то другой) поймут, что функция неполная.
ovitebs,
Нет. совсем
Эти варианты (если я правильно понял, т.к. не знаком с fast API), будут значить:
async def read_items(q: str = Query(..., min_length=3)): # Функция принимает 1 строковый параметр длинной не менее 3-х символов, плюс еще одно условие которое будет добавлено потом
pass
async def read_items(q: str = Query(min_length=3)): # Функция принимает 1 строковый параметр длинной не менее 3-х символов
pass
async def read_items(q: str): # Функция принимает 1 строковый параметр (любой)
pass
Читайте "..." как "что угодно" или "что-нибудь". def foo(a: ..., b: int) -> ...
Это то же самое. Здесь a — любой тип, возвращает что угодно. def foo(a: any, b: int) -> ...
def bar():
...
И то же самое:
def foo():
pass
Используем "..." как временный маркер, некий todo, чтобы вернуться сюда позже.