Привет!
Под катом множество сложных технических тем внутри питона: от генерации стратегий hypothesis до устройства тайпчекера MyPy.
В качестве тестового формата решил сделать подборку сложных технических тем, про которые писал в августе у себя в тг канале: https://t.me/opensource_findings со ссылками на полные посты.
Посмотрим, насколько такой формат работает, напишите свои мысли в комментарии! Буду благодарен обратной связи, поехали!
По ссылке полные посты со всеми техническими деталями, для тех кому интересно узнать глубже.
Поддержка ReadOnly в MyPy
По ссылке объяснение, как работает ReadOnly
в райнтайме и во время проверки типов: https://t.me/opensource_findings/843
Некоторое время назад я добавил тип ReadOnly в CPython. Теперь добавил поддержку в MyPy. Скоро (с версии mypy@1.12.0) мы сможем писать и использовать такой код:
from typing_extensions import ReadOnly, TypedDict
class User(TypedDict):
username: ReadOnly[str] # you cannot change the value of `user['username']`
user: User = {'username': 'sobolevn'}
user['username'] = 'changed' # type error! username is read-only
Генерация данных из аннотаций при помощи hypothesis
По ссылке дополнительные примеры генерации данных и устройства API: https://t.me/opensource_findings/841
Мы все используем и любим (ведь да?) property-based testing. Hypothesis – лидер в данном направлении в мире питона. Используется даже внутри CPython.
В августе я добавил поддержку двух новых типов: LiteralString и ReadOnly
Теперь можно делать так:
from typing import ReadOnly
from hypothesis import given, strategies as st
# MyPy allows this with: --enable-incomplete-feature=InlineTypedDict
def create_user(user: {'email': ReadOnly[str]}) -> User:
"""It somehow builds a user instance from the email."""
@given(st.builds(create_our_user))
def test_user_login_cannot_be_after_created(user: User) -> None:
assert user.last_loggined_at >= user.joined_at
Новый выпуск "Лучшего курса по Питону" про тип bytes
По ссылке множество дополнительных материалов к выпуску: https://t.me/opensource_findings/844
Смотрим, как устроен протокол PyBuffer
, изучаем магические методы __buffer__
и __release_buffer__
, окунаемся в C:
typedef struct {
PyObject_VAR_HEAD
Py_DEPRECATED(3.11) Py_hash_t ob_shash;
char ob_sval[1];
/* Invariants:
* ob_sval contains space for 'ob_size+1' elements.
* ob_sval[ob_size] == 0.
* ob_shash is the hash of the byte string or -1 if not computed yet.
*/
} PyBytesObject;
Type Narrowing в MyPy: overload + TypeGuard
По ссылке куча примеров использований type narrowing и общее объяснение концепции: https://t.me/opensource_findings/845
Некоторое время назад мы выяснили опытным путем, что type narrowing с TypeIs
и TypeGuard
в MyPy не работает, если функция определена как набор @overload
'ов.
Что печально, конечно. Я сделал PR, который чинит данную проблему. Скоро можно будет писать вот такой код (смело и без проблем!):
from typing import TypeIs, overload
from my_app.models import User, PaidUser, FreeUser # User and its subclasses
from my_app.models import Subscription
@overload
def is_paid_user(user: User, subscription: None) -> TypeIs[FreeUser]:
...
@overload
def is_paid_user(user: User, subscription: Subscription) -> TypeIs[PaidUser]:
...
Type narrowing с @overload
и TypeIs
будет работать!
inspect: устаревшие и сломанные части
По ссылке: примеры вопросов для собеседований (если вам не нравятся люди), множество примеров сломанного кода в inspect
: https://t.me/opensource_findings/846
Один из примеров сломанного кода:
>>> import inspect
>>> def func(a: int = 0, /, b: int = 1, *, c: int = 2):
... return inspect.currentframe()
>>> frame = func()
>>> # notice that pos-only and kw-only args are not supported properly:
>>> inspect.formatargvalues(*inspect.getargvalues(frame))
'(a=0, b=1, c=2)'
Обратите внимание, что /
просто игнорируется. И сигнатура получается другой.
И небольшой список сломанного:
inspect.getargvalues
inspect.getfullargspec
asyncio.iscoroutinefunction
В посте путь – как все починить!
Заключение
Вот такой небольшой список улучшений (или ухудшений, тут уж кто как считает) питона я подготовил в августе.
Надеюсь, что такой формат интересен людям: кратко глянуть список и углубиться в нужное для работы / своего любопытства.
Надеюсь на обратную связь, спасибо :)
Комментарии (3)
pvzh
06.09.2024 14:39+1Тут есть ежемесячный дайджест Постгрессо (посвящён PostgreSQL), пользуется спросом. Вот в таком бы формате по Пайтону. Хорошо бы взять пошире, включить разные другие источники, которые вас вдохновляют, включая англоязычные. Но глубину оставить, поверхностных материалов и так хватает. В любом случае, спасибо за старания!
iamtiredofthisplace
Привет с пайтапа!)