python-hyper / h11

A pure-Python, bring-your-own-I/O implementation of HTTP/1.1
https://h11.readthedocs.io/
MIT License
490 stars 62 forks source link

Switch event classes to dataclasses #124

Closed pgjones closed 3 years ago

pgjones commented 3 years ago

The _EventBundle used previously dynamically creates the Event classes, which makes typing hard. As the Event classes are now stable the dynamic creation isn't required, and as h11 supports Python3.6+ dataclasses can be used instead.

This now makes the Events frozen (and almost imutable) which better matches the intended API. In turn it requires the object.__setattr__ usage and the alteration to the _clean_up_response_headers_for_sending method.

This change also improves the performance a little, using the benchmark,

Before: 6.7k requests/sec After: 6.9k requests/sec

Notes:

The test response-header changes are required as the previous version would mutate the response object.

The init for the Data event is required as slots and defaults aren't possible with dataclasses.