Size: a a a

2020 August 27

MK

Maxim Koltsov in PiterPy Meetup
Так не бывает динамических аннотаций
источник

MK

Maxim Koltsov in PiterPy Meetup
Точнее чекера для них нет
источник

Б

Боброний in PiterPy Meetup
Кстати да, mypy ругается
источник

MK

Maxim Koltsov in PiterPy Meetup
У нас же не завтипы :)
источник

E

Eugene in PiterPy Meetup
Maxim Koltsov
Точнее чекера для них нет
Да, его и не может быть статического
источник

E

Eugene in PiterPy Meetup
Но тот же fastapi понимает если я ему в response_model передам Union[tuple_of_types]
источник

MK

Maxim Koltsov in PiterPy Meetup
Eugene
Но тот же fastapi понимает если я ему в response_model передам Union[tuple_of_types]
А что в этом странного?
источник

E

Eugene in PiterPy Meetup
Maxim Koltsov
А что в этом странного?
Ничего странного, так и ожидалось, просто мне стало интересно, как проаннотировать мой код, который возарщает такую динамическую response_model, завёрнутую в аннотацию Union.
источник

Б

Боброний in PiterPy Meetup
Eugene
Я через mypy не прогонял, мне просто стало интересно, есть ли из коробки механизм аннотировать аннотации, потому что аннотации могут определяться динамически, а не описываться статически в виде литералов. Тут, конечно, любой статический анализатор типов должен отвалиться там где аннотация не известна в момент анализа исходников.  Вот тут как раз и нужна аннотация для аннотаций. Чтобы анализатор посмотрел на возвращаемое значение той же функции и понял, что она возвращает аннотацию.

Немного ломает мозг эта новая мода, строить на аннотациях логику приложения, но не я это придумал. pydantic, fastapi через всё это и работают.
По идее, проблема здесь в том, что аннотация это уже не тип, а конкретное значение чего-то
источник

E

Eugene in PiterPy Meetup
аннотация - это уже не тип и ещё не тип. А что такое аннотация с точки зрения питона? А ничего, они же игнорируются. аннотация - что дышло: куда повернёшь - туда и вышло. :)

Но если серьёзно, в typing же есть функция get_type_hints. Она как раз возвращает аннотации.
источник

E

Eugene in PiterPy Meetup
Так то можно, конечно, ничего и не аннотировать, а возвращать из функции кортеж и в Union обворачивать непосредственно перед передачей куда надо. Но опять же вопрос, как проаннотирован аргумент в функции, которая может принимать аннотации в качестве аргументов. Если честно, не смотрел в этот кусок исходников FastAPI.
источник

DB

Dima Boger in PiterPy Meetup
По-моему там везде Any
источник

E

Eugene in PiterPy Meetup
А как такое зааннотировать?

def build_model() -> Type[не_знаю_что_писать]:
   ...

   class Model(BaseModel):
       ...
   
   return Model


postponed annotations будут тут работать? 😀
источник

MK

Maxim Koltsov in PiterPy Meetup
вроде Type[BaseModel] прокатит?
источник

MK

Maxim Koltsov in PiterPy Meetup
потому что ты возвращаешь наследника
источник

E

Eugene in PiterPy Meetup
Ну как бы да, самое очевидное, я так и пишу.
источник

E

Eugene in PiterPy Meetup
Как они так api делают?

from typing import List, get_origin, get_args

type_hint = List[str]
args = get_args(type_hint)
origin = get_origin(type_hint)

origin[args]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-36-1a6059c5cf58> in <module>
----> 1 origin[args]

TypeError: 'type' object is not subscriptable

origin
Out[37]: list


Я могу разобрать type-hint, но собрать его обратно не могу. 🤷🏻‍♂️😀

В 3.9 этот код, видимо, починится, потому что list[args] будет валидной конструкцией.

Но как так можно то?!
источник

Б

Боброний in PiterPy Meetup
Maxim Koltsov
вроде Type[BaseModel] прокатит?
Да
источник
2020 August 30

DS

David Shiko in PiterPy Meetup
Всем привет. Такой вопрос про REST: Как сделать лайки для контента?
вар_1: PUT https://host/content/id/like
вар_2: PUT https://host/set-like (подробности в body запроса)
вар_3: PUT https://content/:id/like
Отсюда кстати вопрос, что делает : в url? ))
источник

ED

Eugene Denisov in PiterPy Meetup
David Shiko
Всем привет. Такой вопрос про REST: Как сделать лайки для контента?
вар_1: PUT https://host/content/id/like
вар_2: PUT https://host/set-like (подробности в body запроса)
вар_3: PUT https://content/:id/like
Отсюда кстати вопрос, что делает : в url? ))
POST /likes
источник