Trio

Latest version: v0.29.0

Safety actively analyzes 722491 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 1 of 3

0.29.0

**Full Changelog**: https://github.com/python-trio/trio/compare/v0.28.0...v0.29.0

Features
---

- Add `trio.lowlevel.in_trio_run` and `trio.lowlevel.in_trio_task` and document the semantics (and differences) thereof. (https://github.com/python-trio/trio/issues/2757)
- If `trio.testing.RaisesGroup` does not get the expected exceptions it now raises an `AssertionError` with a helpful message, instead of letting the raised exception/group fall through. The raised exception is available in the ``__context__`` of the `AssertionError` and can be seen in the traceback. (https://github.com/python-trio/trio/issues/3145)


Bugfixes
---

- Clear Trio's cache of worker threads upon `os.fork`. (https://github.com/python-trio/trio/issues/2764)


Miscellaneous internal changes
---

- Stop using ctypes to mutate tracebacks for ``strict_exception_groups=False``'s exception collapsing. (https://github.com/python-trio/trio/issues/405)
- Fixed spelling error in Windows error code enum for ``ERROR_INVALID_PARAMETER``. (https://github.com/python-trio/trio/issues/3166)
- Publicly re-export ``__version__`` for type checking purposes. (https://github.com/python-trio/trio/issues/3186)
- The typing of `trio.abc.HostnameResolver.getaddrinfo` has been corrected to match that of the stdlib `socket.getaddrinfo`, which was updated in mypy 1.15 (via a typeshed update) to include the possibility of ``tuple[int, bytes]`` for the ``sockaddr`` field of the result. This happens in situations where Python was compiled with ``--disable-ipv6``.

Additionally, the static typing of `trio.to_thread.run_sync`, `trio.from_thread.run` and `trio.from_thread.run_sync` has been improved and should reflect the underlying function being run. (https://github.com/python-trio/trio/issues/3201)

0.28.0

**Full Changelog**: https://github.com/python-trio/trio/compare/v0.27.0...v0.28.0


Bugfixes
---

- :func:`inspect.iscoroutinefunction` and the like now give correct answers when
called on KI-protected functions. (https://github.com/python-trio/trio/issues/2670)
- Rework KeyboardInterrupt protection to track code objects, rather than frames,
as protected or not. The new implementation no longer needs to access
`frame.f_locals` dictionaries, so it won't artificially extend the lifetime of
local variables. Since KeyboardInterrupt protection is now imposed statically
(when a protected function is defined) rather than each time the function runs,
its previously-noticeable performance overhead should now be near zero.
The lack of a call-time wrapper has some other benefits as well:

* :func:`inspect.iscoroutinefunction` and the like now give correct answers when
called on KI-protected functions.

* Calling a synchronous KI-protected function no longer pushes an additional stack
frame, so tracebacks are clearer.

* A synchronous KI-protected function invoked from C code (such as a weakref
finalizer) is now guaranteed to start executing; previously there would be a brief
window in which KeyboardInterrupt could be raised before the protection was
established.

One minor drawback of the new approach is that multiple instances of the same
closure share a single KeyboardInterrupt protection state (because they share a
single code object). That means that if you apply
`trio.lowlevel.enable_ki_protection` to some of them
and not others, you won't get the protection semantics you asked for. See the
documentation of `trio.lowlevel.enable_ki_protection`
for more details and a workaround. (https://github.com/python-trio/trio/issues/3108)
- Rework foreign async generator finalization to track async generator
ids rather than mutating `ag_frame.f_locals`. This fixes an issue
with the previous implementation: locals' lifetimes will no longer be
extended by materialization in the `ag_frame.f_locals` dictionary that
the previous finalization dispatcher logic needed to access to do its work. (https://github.com/python-trio/trio/issues/3112)
- Ensure that Pyright recognizes our underscore prefixed attributes for attrs classes. (https://github.com/python-trio/trio/issues/3114)
- Fix `trio.testing.RaisesGroup`'s typing. (https://github.com/python-trio/trio/issues/3141)


Improved documentation
---

- Improve error message when run after gevent's monkey patching. (https://github.com/python-trio/trio/issues/3087)
- Document that `trio.sleep_forever` is guaranteed to raise an exception now. (https://github.com/python-trio/trio/issues/3113)


Removals without deprecations
---

- Remove workaround for OpenSSL 1.1.1 DTLS ClientHello bug. (https://github.com/python-trio/trio/issues/3097)
- Drop support for Python 3.8. (https://github.com/python-trio/trio/issues/3104) (https://github.com/python-trio/trio/issues/3106)


Miscellaneous internal changes
---

- Switch to using PEP570 for positional-only arguments for `trio.socket.SocketType`'s methods. (https://github.com/python-trio/trio/issues/3094)
- Improve type annotations in several places by removing `Any` usage. (https://github.com/python-trio/trio/issues/3121)
- Get and enforce 100% coverage (https://github.com/python-trio/trio/issues/3159)

0.27.0

**Full Changelog**: https://github.com/python-trio/trio/compare/v0.26.2...v0.27.0

Breaking changes
---

- `trio.move_on_after` and `trio.fail_after` previously set the deadline relative to initialization time, instead of more intuitively upon entering the context manager. This might change timeouts if a program relied on this behavior. If you want to restore previous behavior you should instead use ``trio.move_on_at(trio.current_time() + ...)``.
flake8-async has a new rule to catch this, in case you're supporting older trio versions. See `ASYNC122`. (https://github.com/python-trio/trio/issues/2512)


Features
---

- `CancelScope.relative_deadline` and `CancelScope.is_relative` added, as well as a ``relative_deadline`` parameter to ``__init__``. This allows initializing scopes ahead of time, but where the specified relative deadline doesn't count down until the scope is entered. (https://github.com/python-trio/trio/issues/2512)
- `trio.Lock` and `trio.StrictFIFOLock` will now raise `trio.BrokenResourceError` when `trio.Lock.acquire` would previously stall due to the owner of the lock exiting without releasing the lock. (https://github.com/python-trio/trio/issues/3035)
- `trio.move_on_at`, `trio.move_on_after`, `trio.fail_at` and `trio.fail_after` now accept *shield* as a keyword argument. If specified, it provides an initial value for the `~trio.CancelScope.shield` attribute of the `trio.CancelScope` object created by the context manager. (https://github.com/python-trio/trio/issues/3052)
- Added `trio.lowlevel.add_parking_lot_breaker` and `trio.lowlevel.remove_parking_lot_breaker` to allow creating custom lock/semaphore implementations that will break their underlying parking lot if a task exits unexpectedly. `trio.lowlevel.ParkingLot.break_lot` is also added, to allow breaking a parking lot intentionally. (https://github.com/python-trio/trio/issues/3081)


Bugfixes
---

- Allow sockets to bind any ``os.PathLike`` object. (https://github.com/python-trio/trio/issues/3041)
- Update ``trio.lowlevel.open_process``'s documentation to allow bytes. (https://github.com/python-trio/trio/issues/3076)
- Update `trio.sleep_forever` to be `NoReturn`. (https://github.com/python-trio/trio/issues/3095)


Improved documentation
---

- Add docstrings for memory channels' ``statistics()`` and ``aclose`` methods. (https://github.com/python-trio/trio/issues/3101)

0.26.2

**Full Changelog**: https://github.com/python-trio/trio/compare/v0.26.1...v0.26.2

Bugfixes
---

- Remove remaining ``hash`` usage and fix test configuration issue that prevented it from being caught. (https://github.com/python-trio/trio/issues/3053)

0.26.1

**Full Changelog**: https://github.com/python-trio/trio/compare/v0.26.0...v0.26.1

Bugfixes
---

- Switched ``attrs`` usage off of ``hash``, which is now deprecated. (https://github.com/python-trio/trio/issues/3053)


Miscellaneous internal changes
---

- Use PyPI's Trusted Publishers to make releases. (https://github.com/python-trio/trio/issues/2980)

0.26.0

**Full Changelog**: https://github.com/python-trio/trio/compare/v0.25.1...v0.26.0

Features
---

- Added an interactive interpreter ``python -m trio``.

This makes it easier to try things and experiment with trio in the a Python repl.
Use the ``await`` keyword without needing to call ``trio.run()``

sh
$ python -m trio
Trio 0.26.0, Python 3.10.6
Use "await" directly instead of "trio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import trio
>>> await trio.sleep(1); print("hi") prints after one second
hi


See [interactive debugging](https://trio.readthedocs.io/en/stable/reference-core.html#interactive-debugging) for further detail. (https://github.com/python-trio/trio/issues/2972)
- `trio.testing.RaisesGroup` can now catch an unwrapped exception with ``unwrapped=True``. This means that the behaviour of `except*` can be fully replicated in combination with ``flatten_subgroups=True`` (formerly ``strict=False``). (https://github.com/python-trio/trio/issues/2989)


Bugfixes
---

- Fixed a bug where `trio.testing.RaisesGroup(..., strict=False)` would check the number of exceptions in the raised `ExceptionGroup` before flattening subgroups, leading to incorrectly failed matches.
It now properly supports end (``$``) regex markers in the ``match`` message, by no longer including " (x sub-exceptions)" in the string it matches against. (https://github.com/python-trio/trio/issues/2989)


Deprecations and removals
---

- Deprecated ``strict`` parameter from `trio.testing.RaisesGroup`, previous functionality of ``strict=False`` is now in ``flatten_subgroups=True``. (https://github.com/python-trio/trio/issues/2989)

Page 1 of 3

© 2025 Safety CLI Cybersecurity Inc. All Rights Reserved.