feat!: drop Python 3.10 - #552
Merged
Merged
Conversation
There was a problem hiding this comment.
Benchmark
Details
| Benchmark suite | Current: 1e928f5 | Previous: 57d766b | Ratio |
|---|---|---|---|
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type |
2989626.44467516 iter/sec (stddev: 1.4645598277692729e-8) |
3614640.0440299055 iter/sec (stddev: 1.607689610789833e-8) |
1.21 |
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry |
3138900.4243519125 iter/sec (stddev: 1.3857333262265615e-8) |
3613607.37101661 iter/sec (stddev: 1.8429723622872588e-8) |
1.15 |
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve |
16350.861713056067 iter/sec (stddev: 0.0000442005014390633) |
14983.349814429757 iter/sec (stddev: 0.000056999021269073526) |
0.92 |
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached |
13201.079852881641 iter/sec (stddev: 0.00011588647692419056) |
12772.28969340765 iter/sec (stddev: 0.000155760881123249) |
0.97 |
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] |
338.50489619999024 iter/sec (stddev: 0.00004029347855232769) |
369.1584500827664 iter/sec (stddev: 0.00006535018283212508) |
1.09 |
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] |
325.16716391421585 iter/sec (stddev: 0.00007488556888978227) |
352.266575529102 iter/sec (stddev: 0.000050097003155912846) |
1.08 |
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] |
302.8486100960956 iter/sec (stddev: 0.00005688462533569907) |
329.77881890170994 iter/sec (stddev: 0.0000670627805046678) |
1.09 |
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] |
1651.3274856526941 iter/sec (stddev: 0.00017714958122320724) |
1567.8798489764295 iter/sec (stddev: 0.0002102871811052278) |
0.95 |
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] |
1114.8346692294972 iter/sec (stddev: 0.00025323994755666594) |
1255.7227734132307 iter/sec (stddev: 0.0002346899154467564) |
1.13 |
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] |
856.0318684114928 iter/sec (stddev: 0.00028488512400748757) |
913.3539193157175 iter/sec (stddev: 0.0002462301143844135) |
1.07 |
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[1] |
1320.9327542090928 iter/sec (stddev: 0.0012598952103770801) |
1257.3505498993757 iter/sec (stddev: 0.0012668067129371057) |
0.95 |
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[2] |
1168.9447272574948 iter/sec (stddev: 0.0002287483838433314) |
1103.8702232766773 iter/sec (stddev: 0.00035184756907846227) |
0.94 |
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[4] |
772.4117241054473 iter/sec (stddev: 0.00022907971866503553) |
753.6268764446363 iter/sec (stddev: 0.00025469666061486907) |
0.98 |
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container |
792597.488202698 iter/sec (stddev: 5.1378491779789886e-8) |
819810.9782315302 iter/sec (stddev: 4.615432986323787e-8) |
1.03 |
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope |
726172.7076511333 iter/sec (stddev: 4.4572497060229244e-8) |
750997.968344333 iter/sec (stddev: 8.032264915780852e-8) |
1.03 |
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch |
2363.116633997438 iter/sec (stddev: 0.000012771850834320758) |
2196.718760122603 iter/sec (stddev: 0.00006898048861633186) |
0.93 |
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control |
57722.83859431334 iter/sec (stddev: 0.000002681995178628031) |
56689.00724323654 iter/sec (stddev: 0.0000026349948904927352) |
0.98 |
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale |
43988.8601964208 iter/sec (stddev: 0.000002246050542627313) |
42307.14670681229 iter/sec (stddev: 0.0000033291332693164523) |
0.96 |
benchmarks/test_guard_lifecycle.py::test_g13b_teardown_at_scale_async_no_finalizers |
529.2522069771097 iter/sec (stddev: 0.000023358880394468254) |
542.4555691622402 iter/sec (stddev: 0.00005392622444586941) |
1.02 |
benchmarks/test_guard_resolve.py::test_g1_transient_resolve |
2026761.0488782187 iter/sec (stddev: 2.7396561727257988e-8) |
2181369.0577609935 iter/sec (stddev: 3.20701118310741e-8) |
1.08 |
benchmarks/test_guard_resolve.py::test_g2_cached_resolve |
2827490.080036776 iter/sec (stddev: 1.1007386381107459e-8) |
3353634.785086139 iter/sec (stddev: 3.6396568888459826e-8) |
1.19 |
benchmarks/test_guard_resolve.py::test_g3_deep_chain |
722459.9617198608 iter/sec (stddev: 4.125478172178737e-8) |
682970.609350519 iter/sec (stddev: 3.0595027462448446e-7) |
0.95 |
benchmarks/test_guard_resolve.py::test_g4_wide_resolve |
458559.7386068158 iter/sec (stddev: 2.993745547266525e-7) |
446558.6416007748 iter/sec (stddev: 3.534407178193005e-7) |
0.97 |
benchmarks/test_guard_resolve.py::test_g5_cross_scope |
1823736.920847165 iter/sec (stddev: 2.9347184454060098e-8) |
2016045.8094048374 iter/sec (stddev: 2.8921586035787833e-8) |
1.11 |
benchmarks/test_guard_resolve.py::test_g9_context_resolve |
1039425.5406868078 iter/sec (stddev: 1.3008484579991707e-7) |
1068276.5737078178 iter/sec (stddev: 1.7049355155904538e-7) |
1.03 |
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve |
707027.6962182277 iter/sec (stddev: 6.777404973805501e-8) |
732685.8368784948 iter/sec (stddev: 5.017116564900238e-8) |
1.04 |
benchmarks/test_guard_resolve.py::test_g18_alias_hop |
1995747.74012042 iter/sec (stddev: 1.0527338028035814e-8) |
2014341.1420495408 iter/sec (stddev: 1.6108681399623987e-8) |
1.01 |
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain |
23648.174193869654 iter/sec (stddev: 0.000022747911750112896) |
23143.01293500811 iter/sec (stddev: 0.000022232789607034827) |
0.98 |
benchmarks/test_guard_validate.py::test_g11_validate_wide |
14291.873811100602 iter/sec (stddev: 0.000026054018131333103) |
13762.324121128708 iter/sec (stddev: 0.0000309564549357182) |
0.96 |
This comment was automatically generated by workflow using github-action-benchmark.
This was referenced Oct 4, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Python 3.10 reaches end of life on 2026-10-31. This drops it ahead of that date, matching modern-python/eof-fixer#58. The org standard lets a repo raise its floor without recording a decision, so this has no ADR.
Changes
requires-pythonis now>=3.11,<4, and the 3.10 classifier is gone. The same floor applies tobenchmarks/comparative/pyproject.toml.lintnow runs on 3.11, and"3.10"is dropped from thepytestmatrix.container.pyandgroup.pynow usetyping.Self. TheTYPE_CHECKING-onlytyping_extensionsimport is gone, and so istyping-extensionsfrom thelintgroup. The scheduled-failure script no longer lists it as a likely cause.test_modern_di_imports_without_typing_extensionsis kept: it still guards the zero-runtime-deps claim. Only its pointer tocontainer.py/group.pyis removed.UP017(datetime.UTC) intest_context_provider.pyand makes anoqa: PERF203incache_registry.pyunused. On 3.11+tryis zero-cost, and ruff skips that rule there.test_runtime_cycle_guard.py: removed eight# pragma: no cover - 3.10 coverage loses it after RecursionErrormarkers, plus the comment block and the two pointers that justified them. Without them, coverage stays at 100% on 3.11, 3.12, 3.13, 3.14 and 3.14t, and three repeated runs on 3.11 and 3.14t also held at 100%.Verification
eof-fixer --check,ruff format --check,ruff check,ty check,just test-ci(548 passed, 100% coverage),just adr-checkandjust docs-buildall pass.context kwargskips and are not version-related.Release
This is a breaking change because it drops a supported interpreter. Release it as a minor or major version, not a patch. The integrations (
modern-di-*) still declare 3.10 and will follow in their own PRs.