- Notifications
You must be signed in to change notification settings - Fork5.7k
Remove support for Python 3.9#4827
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:master
Are you sure you want to change the base?
Uh oh!
There was an error while loading.Please reload this page.
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Pull Request Overview
This PR removes support for Python 3.9 and fully adopts Python 3.10+ syntax and tooling.
- Migrated all
Optional[...]
andUnion[...]
type hints to PEP 604 union syntax (X | None
,A | B
). - Updated project configuration, CI, pre-commit, and documentation to require Python >= 3.10.
- Adjusted examples and docs to match the new minimum Python version.
Reviewed Changes
Copilot reviewed 218 out of 218 changed files in this pull request and generated no comments.
Show a summary per file
File | Description |
---|---|
src/telegram/_chatfullinfo.py | SwitchedOptional[...] annotations to PEP 604 union syntax. |
src/telegram/_chatboost.py | Updatedapi_kwargs and type hints to union syntax in boost classes. |
src/telegram/_chatbackground.py | MigratedOptional to union syntax for chat background classes. |
src/telegram/_chatadministratorrights.py | ReplacedOptional[bool] with `bool |
src/telegram/_callbackquery.py | Updated function signatures and return types to union syntax. |
src/telegram/_business.py | ConvertedOptional annotations to union syntax in business classes. |
src/telegram/_botname.py | Adjustedapi_kwargs type to union syntax. |
src/telegram/_botdescription.py | Changedapi_kwargs annotation to union syntax in description classes. |
src/telegram/_botcommandscope.py | Removed legacyOptional/Union imports and applied union annotations. |
src/telegram/_botcommand.py | Updatedapi_kwargs annotation to union syntax in bot command. |
src/telegram/_birthdate.py | MigratedOptional[int] to `int |
src/telegram/main.py | Changed_git_revision return type to `str |
pyproject.toml | Bumpedrequires-python to>=3.10 and updated Python version fields. |
examples/contexttypesbot.py | Updated example optional parameters to union syntax. |
examples/chatmemberbot.py | Changed return type ofextract_status_change to union syntax. |
docs/auxil/admonition_inserter.py | Adjusted type hints in admonition inserter for union syntax. |
changes/config.py | MigratedOptional to union syntax in chango config. |
README.rst | Updated compatibility statement to Python 3.10+. |
.pre-commit-config.yaml | Adjustedpyupgrade hook args to--py310-plus . |
.github/workflows/unit_tests.yml | Removed Python 3.9 from test matrix. |
Comments suppressed due to low confidence (2)
pyproject.toml:34
- Update the project classifiers to include Python 3.13 and 3.14 to match the CI test matrix and declared compatibility.
"Programming Language :: Python :: 3.12",
pyproject.toml:11
- [nitpick] Consider adding an upper bound to the Python requirement (e.g., ">=3.10,<4.0") to prevent unintended installation on Python 4.x releases.
requires-python = ">=3.10"
harshil21 commentedJun 14, 2025 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
So apparently python recommends using X | Y syntax but this fails in subtle ways and makes life harder in instances like these: >>>fromtypingimportTypeAlias>>>a:TypeAlias="int">>>defthis(arg:a|None):pass...Traceback (mostrecentcalllast):File"<python-input-3>",line1,in<module>defthis(arg:a|None):pass~~^~~~~~TypeError:unsupportedoperand type(s)for|:'str'and'NoneType' Now doing
typeA=int|strb=A|floatexpected=int|float|strb==expected# Falseb=A.__value__|float# Force evaluationb==expected# True Anyway so for now it seems we'll have to settle and keep using Optional/Union in some places... |
Uh oh!
There was an error while loading.Please reload this page.
To be merged after#4825 and after python 3.9 reaches EOL in October
A lot of find and replace along with copilot agent edits.
Didn't use the new TypeGuard feature yet.
match
statements is also not used right now.