Title: Discourage and deprecate `typing.AnyStr` · Issue #105578 · python/cpython · GitHub
Open Graph Title: Discourage and deprecate `typing.AnyStr` · Issue #105578 · python/cpython
X Title: Discourage and deprecate `typing.AnyStr` · Issue #105578 · python/cpython
Description: Feature or enhancement We should discourage and deprecate typing.AnyStr. Pitch typing.AnyStr is bad for many reasons: The name implies that it has something to do with the type Any. It has nothing to do with the type Any. The name implie...
Open Graph Description: Feature or enhancement We should discourage and deprecate typing.AnyStr. Pitch typing.AnyStr is bad for many reasons: The name implies that it has something to do with the type Any. It has nothing ...
X Description: Feature or enhancement We should discourage and deprecate typing.AnyStr. Pitch typing.AnyStr is bad for many reasons: The name implies that it has something to do with the type Any. It has nothing ...
Opengraph URL: https://github.com/python/cpython/issues/105578
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Discourage and deprecate `typing.AnyStr`","articleBody":"# Feature or enhancement\r\n\r\nWe should discourage and deprecate `typing.AnyStr`.\r\n\r\n# Pitch\r\n\r\n`typing.AnyStr` is bad for many reasons:\r\n\r\n1. The name implies that it has something to do with the type `Any`. It has nothing to do with the type `Any`.\r\n2. The name implies that it means \"any string\". It does not mean \"any string\".\r\n3. `AnyStr` is a `TypeVar`, but the name does not follow the common naming convention for TypeVars (using a \"T\" suffix). Many users appear to think that it is equivalent to `str | bytes`, which is incorrect.\r\n4. `AnyStr` is the only type variable that is publicly exported from the `typing` module. Unusually, it is a constrained type variable. Constrained type variables are usually not what users want for modern APIs. Bound type variables, in general, have more intuitive semantics than constrained type variables.\r\n5. One of the motivations for PEP-695 (accepted by the Steering Council, and now implemented) was the fact that reusable type variables can be confusing in terms of their scope. In general, I believe the consensus of the typing community is that using PEP-695 syntax for creating type variables clarifies the scope of type variables and makes them more intuitive for users. As such, we should discourage using reusable TypeVars such as `AnyStr`.\r\n\r\nFor all of these reasons, `AnyStr` is _very_ commonly misused, especially by typing beginners. We get many PRs at typeshed that misuse `AnyStr`, and it can often be hard to catch these misuses in CI (careful manual review is required).\r\n\r\nTherefore, we should discourage and deprecate `typing.AnyStr`. Unfortunately, it is very widely used, so the deprecation period will have to be a long one.\r\n\r\nI propose the following plan:\r\n\r\n1. Clarify the docs for `typing.AnyStr`. Explain more clearly the differences between `AnyStr` and a union; give examples of uses of `AnyStr` that would be invalid. This docs clarification can be backported to 3.12 and 3.11.\r\n2. In Python 3.13, state in the docs that using `AnyStr` is deprecated and that users are encouraged to use PEP-695 syntax wherever possible.\r\n3. In Python 3.16, remove `AnyStr` from `typing.__all__`, and start emitting a `DeprecationWarning` if a user does `from typing import AnyStr` or accesses `typing.AnyStr`.\r\n\r\n Removing it from `__all__` will be a breaking change, but it's the only way to emit a `DeprecationWarning` for `typing.AnyStr` before removing it unless we're okay with emitting a `DeprecationWarning` any time a user does `from typing import *` (and I'm not).\r\n4. In Python 3.18, remove `AnyStr` from the `typing` module.\r\n\r\nThoughts?\n\n\u003c!-- gh-linked-prs --\u003e\n### Linked PRs\n* gh-107045\n* gh-107116\n* gh-107503\n* gh-107504\n\u003c!-- /gh-linked-prs --\u003e\n","author":{"url":"https://github.com/AlexWaygood","@type":"Person","name":"AlexWaygood"},"datePublished":"2023-06-09T16:00:42.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":14},"url":"https://github.com/105578/cpython/issues/105578"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:5dcbe3fd-61ba-cb46-b5d8-fb44e92ed72b |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | B7D4:3C7D7F:1C34D8A:269F1C1:696ABD62 |
| html-safe-nonce | 5be37659ccce28ed8f472f0cc2c0f6f58bf1d3ca65f22931852c1fb8e3aeab70 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCN0Q0OjNDN0Q3RjoxQzM0RDhBOjI2OUYxQzE6Njk2QUJENjIiLCJ2aXNpdG9yX2lkIjoiNzI2ODgwMTA1NTc5MTE2ODg2NiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | f6c048815d20ebe238c4a0e8cd45b72ac0ac54bb8632058a2cdbb6ab64567c43 |
| hovercard-subject-tag | issue:1750147795 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/105578/issue_layout |
| twitter:image | https://opengraph.githubassets.com/a9db2a0497633e901d70913148c5526e4ab291ec2799d2887957d281f477ad45/python/cpython/issues/105578 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/a9db2a0497633e901d70913148c5526e4ab291ec2799d2887957d281f477ad45/python/cpython/issues/105578 |
| og:image:alt | Feature or enhancement We should discourage and deprecate typing.AnyStr. Pitch typing.AnyStr is bad for many reasons: The name implies that it has something to do with the type Any. It has nothing ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | AlexWaygood |
| hostname | github.com |
| expected-hostname | github.com |
| None | 46ce962e0e18113ea447391b6ace8b02d4d2861e57b4fbab3658698f73d8855b |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 30300f30bb3949de255e84a146706a3bdb5c19c9 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width