版本发布 8
**Full Changelog**: https://github.com/python-trio/trio/compare/v0.32.0...v0.33.0 Bugfixes --- - Start supporting Android's new ``"android"`` `sys.platform`. (https://github.com/python-trio/trio/issues/3357) Deprecations and removals --- - Both `trio.testing.RaisesGroup` and `trio.testing.Matcher` have been deprecated. Pytest alternatives ``pytest.RaisesGroup`` and ``pytest.RaisesExc`` (respectively) are considered correct replacement. (https://github.com/python-trio/trio/issues/3326)
**Full Changelog**: https://github.com/python-trio/trio/compare/v0.31.0...v0.32.0 Features --- - Allow `trio.CapacityLimiter` to have zero total_tokens. (https://github.com/python-trio/trio/issues/3321) Bugfixes --- - Fixed a bug where iterating over an ``@as_safe_channel``-derived ``ReceiveChannel`` would raise `trio.BrokenResourceError` if the channel was closed by another task. It now shuts down cleanly. (https://github.com/python-trio/trio/issues/3331) - `trio.lowlevel.Task.iter_await_frames` now works on completed tasks, by returning an empty list of frames if the underlying coroutine has been closed. Previously, it raised an internal error. (https://github.com/python-trio/trio/issues/3337) Removals without deprecations --- - Drop support for Python 3.9. (https://github.com/python-trio/trio/issues/3345) Miscellaneous internal changes --- - Decrease indentation for exception groups raised in `trio.as_safe_channel`. (https://github.com/python-trio/trio/issues/3332)
**Full Changelog**: https://github.com/python-trio/trio/compare/v0.29.0...v0.30.0 Features --- - Add `@trio.as_safe_channel`, a wrapper that can be used to make async generators safe. This will be the suggested fix for the flake8-async lint rule `ASYNC900`. (https://github.com/python-trio/trio/issues/3197) Bugfixes --- - Allow `trio` to be a `types.ModuleType` and still have deprecated attributes. (https://github.com/python-trio/trio/issues/2135) - Fixed socket module for some older systems which lack ``socket.AI_NUMERICSERV``. Now trio works on legacy (pre-Lion) macOS. (https://github.com/python-trio/trio/issues/3133) - Update type hints for `trio.run_process` and `trio.lowlevel.open_process`. (https://github.com/python-trio/trio/issues/3183) - Don't mutate the global runner when MockClock is created. (https://github.com/python-trio/trio/issues/3205) - Fix incorrect return type hint for `Nursery.start()`. (https://github.com/python-trio/trio/issues/3224) Improved documentation --- - Update wording in documentation to more accurately reflect Trio's maturity. (https://github.com/python-trio/trio/issues/3216)
**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)
**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)
**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)
**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)
**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)