[ty] Sync vendored typeshed stubs (#21466)

Co-authored-by: typeshedbot <>
Co-authored-by: Alex Waygood <alex.waygood@gmail.com>
This commit is contained in:
github-actions[bot] 2025-11-15 17:12:32 +00:00 committed by GitHub
parent 29acc1e860
commit efa2b5167f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
38 changed files with 432 additions and 157 deletions

View File

@ -218,6 +218,11 @@ jobs:
- name: Update snapshots - name: Update snapshots
if: ${{ success() }} if: ${{ success() }}
run: | run: |
cargo r \
--profile=profiling \
-p ty_completion_eval \
-- all --tasks ./crates/ty_completion_eval/completion-evaluation-tasks.csv
# The `cargo insta` docs indicate that `--unreferenced=delete` might be a good option, # The `cargo insta` docs indicate that `--unreferenced=delete` might be a good option,
# but from local testing it appears to just revert all changes made by `cargo insta test --accept`. # but from local testing it appears to just revert all changes made by `cargo insta test --accept`.
# #

View File

@ -11,7 +11,7 @@ import-deprioritizes-type_check_only,main.py,2,1
import-deprioritizes-type_check_only,main.py,3,2 import-deprioritizes-type_check_only,main.py,3,2
import-deprioritizes-type_check_only,main.py,4,3 import-deprioritizes-type_check_only,main.py,4,3
import-keyword-completion,main.py,0,1 import-keyword-completion,main.py,0,1
internal-typeshed-hidden,main.py,0,5 internal-typeshed-hidden,main.py,0,4
none-completion,main.py,0,2 none-completion,main.py,0,2
numpy-array,main.py,0, numpy-array,main.py,0,
numpy-array,main.py,1,1 numpy-array,main.py,1,1

1 name file index rank
11 import-deprioritizes-type_check_only main.py 3 2
12 import-deprioritizes-type_check_only main.py 4 3
13 import-keyword-completion main.py 0 1
14 internal-typeshed-hidden main.py 0 5 4
15 none-completion main.py 0 2
16 numpy-array main.py 0
17 numpy-array main.py 1 1

View File

@ -1206,7 +1206,6 @@ type<CURSOR>
@r" @r"
TypeError :: <class 'TypeError'> TypeError :: <class 'TypeError'>
type :: <class 'type'> type :: <class 'type'>
_NotImplementedType :: <class '_NotImplementedType'>
", ",
); );
} }
@ -2092,7 +2091,7 @@ C.<CURSOR>
__call__ :: bound method <class 'C'>.__call__(...) -> Any __call__ :: bound method <class 'C'>.__call__(...) -> Any
__class__ :: <class 'Meta'> __class__ :: <class 'Meta'>
__delattr__ :: def __delattr__(self, name: str, /) -> None __delattr__ :: def __delattr__(self, name: str, /) -> None
__dict__ :: MappingProxyType[str, Any] __dict__ :: dict[str, Any]
__dictoffset__ :: int __dictoffset__ :: int
__dir__ :: def __dir__(self) -> Iterable[str] __dir__ :: def __dir__(self) -> Iterable[str]
__doc__ :: str | None __doc__ :: str | None
@ -2291,7 +2290,7 @@ Quux.<CURSOR>
__call__ :: bound method <class 'Quux'>.__call__(...) -> Any __call__ :: bound method <class 'Quux'>.__call__(...) -> Any
__class__ :: <class 'type'> __class__ :: <class 'type'>
__delattr__ :: def __delattr__(self, name: str, /) -> None __delattr__ :: def __delattr__(self, name: str, /) -> None
__dict__ :: MappingProxyType[str, Any] __dict__ :: dict[str, Any]
__dictoffset__ :: int __dictoffset__ :: int
__dir__ :: def __dir__(self) -> Iterable[str] __dir__ :: def __dir__(self) -> Iterable[str]
__doc__ :: str | None __doc__ :: str | None
@ -2365,7 +2364,7 @@ Answer.<CURSOR>
__copy__ :: def __copy__(self) -> Self@__copy__ __copy__ :: def __copy__(self) -> Self@__copy__
__deepcopy__ :: def __deepcopy__(self, memo: Any) -> Self@__deepcopy__ __deepcopy__ :: def __deepcopy__(self, memo: Any) -> Self@__deepcopy__
__delattr__ :: def __delattr__(self, name: str, /) -> None __delattr__ :: def __delattr__(self, name: str, /) -> None
__dict__ :: MappingProxyType[str, Any] __dict__ :: dict[str, Any]
__dictoffset__ :: int __dictoffset__ :: int
__dir__ :: def __dir__(self) -> list[str] __dir__ :: def __dir__(self) -> list[str]
__doc__ :: str | None __doc__ :: str | None

View File

@ -1605,13 +1605,13 @@ a: float<CURSOR> = 3.14
assert_snapshot!(test.goto_definition(), @r#" assert_snapshot!(test.goto_definition(), @r#"
info[goto-definition]: Definition info[goto-definition]: Definition
--> stdlib/builtins.pyi:346:7 --> stdlib/builtins.pyi:348:7
| |
345 | @disjoint_base 347 | @disjoint_base
346 | class int: 348 | class int:
| ^^^ | ^^^
347 | """int([x]) -> integer 349 | """int([x]) -> integer
348 | int(x, base=10) -> integer 350 | int(x, base=10) -> integer
| |
info: Source info: Source
--> main.py:2:4 --> main.py:2:4
@ -1621,12 +1621,12 @@ a: float<CURSOR> = 3.14
| |
info[goto-definition]: Definition info[goto-definition]: Definition
--> stdlib/builtins.pyi:659:7 --> stdlib/builtins.pyi:661:7
| |
658 | @disjoint_base 660 | @disjoint_base
659 | class float: 661 | class float:
| ^^^^^ | ^^^^^
660 | """Convert a string or number to a floating-point number, if possible.""" 662 | """Convert a string or number to a floating-point number, if possible."""
| |
info: Source info: Source
--> main.py:2:4 --> main.py:2:4
@ -1650,13 +1650,13 @@ a: complex<CURSOR> = 3.14
assert_snapshot!(test.goto_definition(), @r#" assert_snapshot!(test.goto_definition(), @r#"
info[goto-definition]: Definition info[goto-definition]: Definition
--> stdlib/builtins.pyi:346:7 --> stdlib/builtins.pyi:348:7
| |
345 | @disjoint_base 347 | @disjoint_base
346 | class int: 348 | class int:
| ^^^ | ^^^
347 | """int([x]) -> integer 349 | """int([x]) -> integer
348 | int(x, base=10) -> integer 350 | int(x, base=10) -> integer
| |
info: Source info: Source
--> main.py:2:4 --> main.py:2:4
@ -1666,12 +1666,12 @@ a: complex<CURSOR> = 3.14
| |
info[goto-definition]: Definition info[goto-definition]: Definition
--> stdlib/builtins.pyi:659:7 --> stdlib/builtins.pyi:661:7
| |
658 | @disjoint_base 660 | @disjoint_base
659 | class float: 661 | class float:
| ^^^^^ | ^^^^^
660 | """Convert a string or number to a floating-point number, if possible.""" 662 | """Convert a string or number to a floating-point number, if possible."""
| |
info: Source info: Source
--> main.py:2:4 --> main.py:2:4
@ -1681,12 +1681,12 @@ a: complex<CURSOR> = 3.14
| |
info[goto-definition]: Definition info[goto-definition]: Definition
--> stdlib/builtins.pyi:820:7 --> stdlib/builtins.pyi:822:7
| |
819 | @disjoint_base 821 | @disjoint_base
820 | class complex: 822 | class complex:
| ^^^^^^^ | ^^^^^^^
821 | """Create a complex number from a string or numbers. 823 | """Create a complex number from a string or numbers.
| |
info: Source info: Source
--> main.py:2:4 --> main.py:2:4

View File

@ -199,13 +199,13 @@ mod tests {
assert_snapshot!(test.goto_type_definition(), @r#" assert_snapshot!(test.goto_type_definition(), @r#"
info[goto-type-definition]: Type definition info[goto-type-definition]: Type definition
--> stdlib/builtins.pyi:913:7 --> stdlib/builtins.pyi:915:7
| |
912 | @disjoint_base 914 | @disjoint_base
913 | class str(Sequence[str]): 915 | class str(Sequence[str]):
| ^^^ | ^^^
914 | """str(object='') -> str 916 | """str(object='') -> str
915 | str(bytes_or_buffer[, encoding[, errors]]) -> str 917 | str(bytes_or_buffer[, encoding[, errors]]) -> str
| |
info: Source info: Source
--> main.py:4:1 --> main.py:4:1
@ -227,13 +227,13 @@ mod tests {
assert_snapshot!(test.goto_type_definition(), @r#" assert_snapshot!(test.goto_type_definition(), @r#"
info[goto-type-definition]: Type definition info[goto-type-definition]: Type definition
--> stdlib/builtins.pyi:913:7 --> stdlib/builtins.pyi:915:7
| |
912 | @disjoint_base 914 | @disjoint_base
913 | class str(Sequence[str]): 915 | class str(Sequence[str]):
| ^^^ | ^^^
914 | """str(object='') -> str 916 | """str(object='') -> str
915 | str(bytes_or_buffer[, encoding[, errors]]) -> str 917 | str(bytes_or_buffer[, encoding[, errors]]) -> str
| |
info: Source info: Source
--> main.py:2:10 --> main.py:2:10
@ -334,13 +334,13 @@ mod tests {
assert_snapshot!(test.goto_type_definition(), @r#" assert_snapshot!(test.goto_type_definition(), @r#"
info[goto-type-definition]: Type definition info[goto-type-definition]: Type definition
--> stdlib/builtins.pyi:913:7 --> stdlib/builtins.pyi:915:7
| |
912 | @disjoint_base 914 | @disjoint_base
913 | class str(Sequence[str]): 915 | class str(Sequence[str]):
| ^^^ | ^^^
914 | """str(object='') -> str 916 | """str(object='') -> str
915 | str(bytes_or_buffer[, encoding[, errors]]) -> str 917 | str(bytes_or_buffer[, encoding[, errors]]) -> str
| |
info: Source info: Source
--> main.py:4:6 --> main.py:4:6
@ -368,13 +368,13 @@ mod tests {
// is an int. Navigating to `str` would match pyright's behavior. // is an int. Navigating to `str` would match pyright's behavior.
assert_snapshot!(test.goto_type_definition(), @r#" assert_snapshot!(test.goto_type_definition(), @r#"
info[goto-type-definition]: Type definition info[goto-type-definition]: Type definition
--> stdlib/builtins.pyi:346:7 --> stdlib/builtins.pyi:348:7
| |
345 | @disjoint_base 347 | @disjoint_base
346 | class int: 348 | class int:
| ^^^ | ^^^
347 | """int([x]) -> integer 349 | """int([x]) -> integer
348 | int(x, base=10) -> integer 350 | int(x, base=10) -> integer
| |
info: Source info: Source
--> main.py:4:6 --> main.py:4:6
@ -401,13 +401,13 @@ f(**kwargs<CURSOR>)
assert_snapshot!(test.goto_type_definition(), @r#" assert_snapshot!(test.goto_type_definition(), @r#"
info[goto-type-definition]: Type definition info[goto-type-definition]: Type definition
--> stdlib/builtins.pyi:2918:7 --> stdlib/builtins.pyi:2920:7
| |
2917 | @disjoint_base 2919 | @disjoint_base
2918 | class dict(MutableMapping[_KT, _VT]): 2920 | class dict(MutableMapping[_KT, _VT]):
| ^^^^ | ^^^^
2919 | """dict() -> new empty dictionary 2921 | """dict() -> new empty dictionary
2920 | dict(mapping) -> new dictionary initialized from a mapping object's 2922 | dict(mapping) -> new dictionary initialized from a mapping object's
| |
info: Source info: Source
--> main.py:6:5 --> main.py:6:5
@ -431,13 +431,13 @@ f(**kwargs<CURSOR>)
assert_snapshot!(test.goto_type_definition(), @r#" assert_snapshot!(test.goto_type_definition(), @r#"
info[goto-type-definition]: Type definition info[goto-type-definition]: Type definition
--> stdlib/builtins.pyi:913:7 --> stdlib/builtins.pyi:915:7
| |
912 | @disjoint_base 914 | @disjoint_base
913 | class str(Sequence[str]): 915 | class str(Sequence[str]):
| ^^^ | ^^^
914 | """str(object='') -> str 916 | """str(object='') -> str
915 | str(bytes_or_buffer[, encoding[, errors]]) -> str 917 | str(bytes_or_buffer[, encoding[, errors]]) -> str
| |
info: Source info: Source
--> main.py:3:5 --> main.py:3:5
@ -523,13 +523,13 @@ f(**kwargs<CURSOR>)
assert_snapshot!(test.goto_type_definition(), @r#" assert_snapshot!(test.goto_type_definition(), @r#"
info[goto-type-definition]: Type definition info[goto-type-definition]: Type definition
--> stdlib/builtins.pyi:913:7 --> stdlib/builtins.pyi:915:7
| |
912 | @disjoint_base 914 | @disjoint_base
913 | class str(Sequence[str]): 915 | class str(Sequence[str]):
| ^^^ | ^^^
914 | """str(object='') -> str 916 | """str(object='') -> str
915 | str(bytes_or_buffer[, encoding[, errors]]) -> str 917 | str(bytes_or_buffer[, encoding[, errors]]) -> str
| |
info: Source info: Source
--> main.py:4:15 --> main.py:4:15
@ -570,13 +570,13 @@ f(**kwargs<CURSOR>)
| |
info[goto-type-definition]: Type definition info[goto-type-definition]: Type definition
--> stdlib/builtins.pyi:913:7 --> stdlib/builtins.pyi:915:7
| |
912 | @disjoint_base 914 | @disjoint_base
913 | class str(Sequence[str]): 915 | class str(Sequence[str]):
| ^^^ | ^^^
914 | """str(object='') -> str 916 | """str(object='') -> str
915 | str(bytes_or_buffer[, encoding[, errors]]) -> str 917 | str(bytes_or_buffer[, encoding[, errors]]) -> str
| |
info: Source info: Source
--> main.py:3:5 --> main.py:3:5

View File

@ -197,3 +197,9 @@ isinstance("", t.ClassVar) # error: [invalid-argument-type]
isinstance("", t.Final) # error: [invalid-argument-type] isinstance("", t.Final) # error: [invalid-argument-type]
isinstance("", t.Any) # error: [invalid-argument-type] isinstance("", t.Any) # error: [invalid-argument-type]
``` ```
## The builtin `NotImplemented` constant is not callable
```py
NotImplemented() # error: [call-non-callable]
```

View File

@ -466,11 +466,23 @@ def f(cond: bool) -> int:
return "hello" if cond else NotImplemented return "hello" if cond else NotImplemented
``` ```
`NotImplemented` is only special-cased for return types (mirroring the way the interpreter applies
special casing for the symbol at runtime). It is not generally considered assignable to every other
type:
```py
# Other type checkers do not emit an error here,
# but this is likely not a deliberate feature they've implemented;
# it's probably because `NotImplementedType` inherits from `Any`
# according to typeshed. We override typeshed's incorrect MRO
# for more precise type inference.
x: int = NotImplemented # error: [invalid-assignment]
```
### Python 3.10+ ### Python 3.10+
Unlike Ellipsis, `_NotImplementedType` remains in `builtins.pyi` regardless of the Python version. We correctly understand the semantics of `NotImplemented` on all Python versions, even though the
Even if `builtins._NotImplementedType` is fully replaced by `types.NotImplementedType` in the class `types.NotImplementedType` is only exposed in the `types` module on Python 3.10+.
future, it should still work as expected.
```toml ```toml
[environment] [environment]

View File

@ -717,3 +717,17 @@ class F[T](F(), F): ... # error: [cyclic-class-definition]
reveal_type(F.__class__) # revealed: type[Unknown] reveal_type(F.__class__) # revealed: type[Unknown]
reveal_mro(F) # revealed: (<class 'F[Unknown]'>, Unknown, <class 'object'>) reveal_mro(F) # revealed: (<class 'F[Unknown]'>, Unknown, <class 'object'>)
``` ```
## `builtins.NotImplemented`
Typeshed tells us that `NotImplementedType` inherits from `Any`, but that causes more problems for
us than it fixes. We override typeshed here so that we understand `NotImplementedType` as inheriting
directly from `object` (as it does at runtime).
```py
import types
from ty_extensions import reveal_mro
reveal_mro(types.NotImplementedType) # revealed: (<class 'NotImplementedType'>, <class 'object'>)
reveal_mro(type(NotImplemented)) # revealed: (<class 'NotImplementedType'>, <class 'object'>)
```

View File

@ -26,13 +26,13 @@ error[invalid-await]: `Literal[1]` is not awaitable
2 | await 1 # error: [invalid-await] 2 | await 1 # error: [invalid-await]
| ^ | ^
| |
::: stdlib/builtins.pyi:346:7 ::: stdlib/builtins.pyi:348:7
| |
345 | @disjoint_base 347 | @disjoint_base
346 | class int: 348 | class int:
| --- type defined here | --- type defined here
347 | """int([x]) -> integer 349 | """int([x]) -> integer
348 | int(x, base=10) -> integer 350 | int(x, base=10) -> integer
| |
info: `__await__` is missing info: `__await__` is missing
info: rule `invalid-await` is enabled by default info: rule `invalid-await` is enabled by default

View File

@ -4564,7 +4564,15 @@ impl KnownClass {
"ellipsis" "ellipsis"
} }
} }
Self::NotImplementedType => "_NotImplementedType", Self::NotImplementedType => {
// Exposed as `types.NotImplementedType` on Python >=3.10;
// backported as `builtins._NotImplementedType` by typeshed on Python <=3.9
if Program::get(db).python_version(db) >= PythonVersion::PY310 {
"NotImplementedType"
} else {
"_NotImplementedType"
}
}
Self::Field => "Field", Self::Field => "Field",
Self::KwOnly => "KW_ONLY", Self::KwOnly => "KW_ONLY",
Self::InitVar => "InitVar", Self::InitVar => "InitVar",
@ -4866,7 +4874,15 @@ impl KnownClass {
KnownModule::Builtins KnownModule::Builtins
} }
} }
Self::NotImplementedType => KnownModule::Builtins, Self::NotImplementedType => {
// Exposed as `types.NotImplementedType` on Python >=3.10;
// backported as `builtins._NotImplementedType` by typeshed on Python <=3.9
if Program::get(db).python_version(db) >= PythonVersion::PY310 {
KnownModule::Types
} else {
KnownModule::Builtins
}
}
Self::ChainMap Self::ChainMap
| Self::Counter | Self::Counter
| Self::DefaultDict | Self::DefaultDict
@ -5136,7 +5152,12 @@ impl KnownClass {
"EllipsisType" if Program::get(db).python_version(db) >= PythonVersion::PY310 => { "EllipsisType" if Program::get(db).python_version(db) >= PythonVersion::PY310 => {
&[Self::EllipsisType] &[Self::EllipsisType]
} }
"_NotImplementedType" => &[Self::NotImplementedType], "_NotImplementedType" if Program::get(db).python_version(db) <= PythonVersion::PY39 => {
&[Self::NotImplementedType]
}
"NotImplementedType" if Program::get(db).python_version(db) >= PythonVersion::PY310 => {
&[Self::NotImplementedType]
}
"Field" => &[Self::Field], "Field" => &[Self::Field],
"KW_ONLY" => &[Self::KwOnly], "KW_ONLY" => &[Self::KwOnly],
"InitVar" => &[Self::InitVar], "InitVar" => &[Self::InitVar],

View File

@ -7,7 +7,7 @@ use rustc_hash::FxBuildHasher;
use crate::Db; use crate::Db;
use crate::types::class_base::ClassBase; use crate::types::class_base::ClassBase;
use crate::types::generics::Specialization; use crate::types::generics::Specialization;
use crate::types::{ClassLiteral, ClassType, KnownInstanceType, SpecialFormType, Type}; use crate::types::{ClassLiteral, ClassType, KnownClass, KnownInstanceType, SpecialFormType, Type};
/// The inferred method resolution order of a given class. /// The inferred method resolution order of a given class.
/// ///
@ -52,6 +52,11 @@ impl<'db> Mro<'db> {
specialization: Option<Specialization<'db>>, specialization: Option<Specialization<'db>>,
) -> Result<Self, MroError<'db>> { ) -> Result<Self, MroError<'db>> {
let class = class_literal.apply_optional_specialization(db, specialization); let class = class_literal.apply_optional_specialization(db, specialization);
// Special-case `NotImplementedType`: typeshed says that it inherits from `Any`,
// but this causes more problems than it fixes.
if class_literal.is_known(db, KnownClass::NotImplementedType) {
return Ok(Self::from([ClassBase::Class(class), ClassBase::object(db)]));
}
Self::of_class_impl(db, class, class_literal.explicit_bases(db), specialization) Self::of_class_impl(db, class, class_literal.explicit_bases(db), specialization)
.map_err(|err| err.into_mro_error(db, class)) .map_err(|err| err.into_mro_error(db, class))
} }

View File

@ -6,7 +6,7 @@ expression: completions
{ {
"label": "Literal (import typing)", "label": "Literal (import typing)",
"kind": 6, "kind": 6,
"sortText": " 43", "sortText": " 50",
"insertText": "Literal", "insertText": "Literal",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -27,7 +27,7 @@ expression: completions
{ {
"label": "Literal (import typing_extensions)", "label": "Literal (import typing_extensions)",
"kind": 6, "kind": 6,
"sortText": " 44", "sortText": " 51",
"insertText": "Literal", "insertText": "Literal",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -48,7 +48,7 @@ expression: completions
{ {
"label": "LiteralString (import typing)", "label": "LiteralString (import typing)",
"kind": 6, "kind": 6,
"sortText": " 45", "sortText": " 52",
"insertText": "LiteralString", "insertText": "LiteralString",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -69,7 +69,7 @@ expression: completions
{ {
"label": "LiteralString (import typing_extensions)", "label": "LiteralString (import typing_extensions)",
"kind": 6, "kind": 6,
"sortText": " 46", "sortText": " 53",
"insertText": "LiteralString", "insertText": "LiteralString",
"additionalTextEdits": [ "additionalTextEdits": [
{ {

View File

@ -6,7 +6,7 @@ expression: completions
{ {
"label": "Literal (import typing)", "label": "Literal (import typing)",
"kind": 6, "kind": 6,
"sortText": " 43", "sortText": " 50",
"insertText": "Literal", "insertText": "Literal",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -27,7 +27,7 @@ expression: completions
{ {
"label": "Literal (import typing_extensions)", "label": "Literal (import typing_extensions)",
"kind": 6, "kind": 6,
"sortText": " 44", "sortText": " 51",
"insertText": "Literal", "insertText": "Literal",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -48,7 +48,7 @@ expression: completions
{ {
"label": "LiteralString (import typing)", "label": "LiteralString (import typing)",
"kind": 6, "kind": 6,
"sortText": " 45", "sortText": " 52",
"insertText": "LiteralString", "insertText": "LiteralString",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -69,7 +69,7 @@ expression: completions
{ {
"label": "LiteralString (import typing_extensions)", "label": "LiteralString (import typing_extensions)",
"kind": 6, "kind": 6,
"sortText": " 46", "sortText": " 53",
"insertText": "LiteralString", "insertText": "LiteralString",
"additionalTextEdits": [ "additionalTextEdits": [
{ {

View File

@ -6,7 +6,7 @@ expression: completions
{ {
"label": "Literal (import typing)", "label": "Literal (import typing)",
"kind": 6, "kind": 6,
"sortText": " 43", "sortText": " 50",
"insertText": "Literal", "insertText": "Literal",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -27,7 +27,7 @@ expression: completions
{ {
"label": "Literal (import typing_extensions)", "label": "Literal (import typing_extensions)",
"kind": 6, "kind": 6,
"sortText": " 44", "sortText": " 51",
"insertText": "Literal", "insertText": "Literal",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -48,7 +48,7 @@ expression: completions
{ {
"label": "LiteralString (import typing)", "label": "LiteralString (import typing)",
"kind": 6, "kind": 6,
"sortText": " 45", "sortText": " 52",
"insertText": "LiteralString", "insertText": "LiteralString",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -69,7 +69,7 @@ expression: completions
{ {
"label": "LiteralString (import typing_extensions)", "label": "LiteralString (import typing_extensions)",
"kind": 6, "kind": 6,
"sortText": " 46", "sortText": " 53",
"insertText": "LiteralString", "insertText": "LiteralString",
"additionalTextEdits": [ "additionalTextEdits": [
{ {

View File

@ -6,7 +6,7 @@ expression: completions
{ {
"label": "Literal (import typing)", "label": "Literal (import typing)",
"kind": 6, "kind": 6,
"sortText": " 43", "sortText": " 50",
"insertText": "Literal", "insertText": "Literal",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -27,7 +27,7 @@ expression: completions
{ {
"label": "Literal (import typing_extensions)", "label": "Literal (import typing_extensions)",
"kind": 6, "kind": 6,
"sortText": " 44", "sortText": " 51",
"insertText": "Literal", "insertText": "Literal",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -48,7 +48,7 @@ expression: completions
{ {
"label": "LiteralString (import typing)", "label": "LiteralString (import typing)",
"kind": 6, "kind": 6,
"sortText": " 45", "sortText": " 52",
"insertText": "LiteralString", "insertText": "LiteralString",
"additionalTextEdits": [ "additionalTextEdits": [
{ {
@ -69,7 +69,7 @@ expression: completions
{ {
"label": "LiteralString (import typing_extensions)", "label": "LiteralString (import typing_extensions)",
"kind": 6, "kind": 6,
"sortText": " 46", "sortText": " 53",
"insertText": "LiteralString", "insertText": "LiteralString",
"additionalTextEdits": [ "additionalTextEdits": [
{ {

View File

@ -1 +1 @@
bf7214784877c52638844c065360d4814fae4c65 f8cdc0bd526301e873cd952eb0d457bdf2554e57

View File

@ -2,7 +2,7 @@
# _compression is replaced by compression._common._streams on Python 3.14+ (PEP-784) # _compression is replaced by compression._common._streams on Python 3.14+ (PEP-784)
from _typeshed import Incomplete, WriteableBuffer from _typeshed import ReadableBuffer, WriteableBuffer
from collections.abc import Callable from collections.abc import Callable
from io import DEFAULT_BUFFER_SIZE, BufferedIOBase, RawIOBase from io import DEFAULT_BUFFER_SIZE, BufferedIOBase, RawIOBase
from typing import Any, Protocol, type_check_only from typing import Any, Protocol, type_check_only
@ -15,6 +15,17 @@ class _Reader(Protocol):
def seekable(self) -> bool: ... def seekable(self) -> bool: ...
def seek(self, n: int, /) -> Any: ... def seek(self, n: int, /) -> Any: ...
@type_check_only
class _Decompressor(Protocol):
def decompress(self, data: ReadableBuffer, /, max_length: int = ...) -> bytes: ...
@property
def unused_data(self) -> bytes: ...
@property
def eof(self) -> bool: ...
# `zlib._Decompress` does not have next property, but `DecompressReader` calls it:
# @property
# def needs_input(self) -> bool: ...
class BaseStream(BufferedIOBase): class BaseStream(BufferedIOBase):
"""Mode-checking helper functions.""" """Mode-checking helper functions."""
@ -24,7 +35,7 @@ class DecompressReader(RawIOBase):
def __init__( def __init__(
self, self,
fp: _Reader, fp: _Reader,
decomp_factory: Callable[..., Incomplete], decomp_factory: Callable[..., _Decompressor],
trailing_error: type[Exception] | tuple[type[Exception], ...] = (), trailing_error: type[Exception] | tuple[type[Exception], ...] = (),
**decomp_args: Any, # These are passed to decomp_factory. **decomp_args: Any, # These are passed to decomp_factory.
) -> None: ... ) -> None: ...

View File

@ -89,7 +89,7 @@ class Protocol(BaseProtocol):
""" """
# Need annotation or mypy will complain about 'Cannot determine type of "__slots__" in base class' # Need annotation or mypy will complain about 'Cannot determine type of "__slots__" in base class'
__slots__: tuple[()] = () __slots__: tuple[str, ...] = ()
def data_received(self, data: bytes) -> None: def data_received(self, data: bytes) -> None:
"""Called when some data is received. """Called when some data is received.
@ -182,7 +182,7 @@ class DatagramProtocol(BaseProtocol):
class SubprocessProtocol(BaseProtocol): class SubprocessProtocol(BaseProtocol):
"""Interface for protocol for subprocess calls.""" """Interface for protocol for subprocess calls."""
__slots__: tuple[()] = () __slots__: tuple[str, ...] = ()
def pipe_data_received(self, fd: int, data: bytes) -> None: def pipe_data_received(self, fd: int, data: bytes) -> None:
"""Called when the subprocess writes data into stdout/stderr pipe. """Called when the subprocess writes data into stdout/stderr pipe.

View File

@ -54,6 +54,7 @@ from typing import ( # noqa: Y022,UP035
Any, Any,
BinaryIO, BinaryIO,
ClassVar, ClassVar,
Final,
Generic, Generic,
Mapping, Mapping,
MutableMapping, MutableMapping,
@ -254,8 +255,9 @@ class type:
__bases__: tuple[type, ...] __bases__: tuple[type, ...]
@property @property
def __basicsize__(self) -> int: ... def __basicsize__(self) -> int: ...
@property # type.__dict__ is read-only at runtime, but that can't be expressed currently.
def __dict__(self) -> types.MappingProxyType[str, Any]: ... # type: ignore[override] # See https://github.com/python/typeshed/issues/11033 for a discussion.
__dict__: Final[types.MappingProxyType[str, Any]] # type: ignore[assignment]
@property @property
def __dictoffset__(self) -> int: ... def __dictoffset__(self) -> int: ...
@property @property
@ -3356,13 +3358,6 @@ class property:
def __delete__(self, instance: Any, /) -> None: def __delete__(self, instance: Any, /) -> None:
"""Delete an attribute of instance.""" """Delete an attribute of instance."""
@final
@type_check_only
class _NotImplementedType(Any):
__call__: None
NotImplemented: _NotImplementedType
def abs(x: SupportsAbs[_T], /) -> _T: def abs(x: SupportsAbs[_T], /) -> _T:
"""Return the absolute value of the argument.""" """Return the absolute value of the argument."""
@ -4494,14 +4489,14 @@ def __build_class__(func: Callable[[], CellType | Any], name: str, /, *bases: An
""" """
if sys.version_info >= (3, 10): if sys.version_info >= (3, 10):
from types import EllipsisType from types import EllipsisType, NotImplementedType
# Backwards compatibility hack for folks who relied on the ellipsis type # Backwards compatibility hack for folks who relied on the ellipsis type
# existing in typeshed in Python 3.9 and earlier. # existing in typeshed in Python 3.9 and earlier.
ellipsis = EllipsisType ellipsis = EllipsisType
Ellipsis: EllipsisType Ellipsis: EllipsisType
NotImplemented: NotImplementedType
else: else:
# Actually the type of Ellipsis is <type 'ellipsis'>, but since it's # Actually the type of Ellipsis is <type 'ellipsis'>, but since it's
# not exposed anywhere under that name, we make it private here. # not exposed anywhere under that name, we make it private here.
@ -4511,6 +4506,12 @@ else:
Ellipsis: ellipsis Ellipsis: ellipsis
@final
@type_check_only
class _NotImplementedType(Any): ...
NotImplemented: _NotImplementedType
@disjoint_base @disjoint_base
class BaseException: class BaseException:
"""Common base class for all exceptions""" """Common base class for all exceptions"""

View File

@ -1,6 +1,6 @@
"""Internal classes used by compression modules""" """Internal classes used by compression modules"""
from _typeshed import Incomplete, WriteableBuffer from _typeshed import ReadableBuffer, WriteableBuffer
from collections.abc import Callable from collections.abc import Callable
from io import DEFAULT_BUFFER_SIZE, BufferedIOBase, RawIOBase from io import DEFAULT_BUFFER_SIZE, BufferedIOBase, RawIOBase
from typing import Any, Protocol, type_check_only from typing import Any, Protocol, type_check_only
@ -13,6 +13,17 @@ class _Reader(Protocol):
def seekable(self) -> bool: ... def seekable(self) -> bool: ...
def seek(self, n: int, /) -> Any: ... def seek(self, n: int, /) -> Any: ...
@type_check_only
class _Decompressor(Protocol):
def decompress(self, data: ReadableBuffer, /, max_length: int = ...) -> bytes: ...
@property
def unused_data(self) -> bytes: ...
@property
def eof(self) -> bool: ...
# `zlib._Decompress` does not have next property, but `DecompressReader` calls it:
# @property
# def needs_input(self) -> bool: ...
class BaseStream(BufferedIOBase): class BaseStream(BufferedIOBase):
"""Mode-checking helper functions.""" """Mode-checking helper functions."""
@ -22,7 +33,7 @@ class DecompressReader(RawIOBase):
def __init__( def __init__(
self, self,
fp: _Reader, fp: _Reader,
decomp_factory: Callable[..., Incomplete], # Consider backporting changes to _compression decomp_factory: Callable[..., _Decompressor], # Consider backporting changes to _compression
trailing_error: type[Exception] | tuple[type[Exception], ...] = (), trailing_error: type[Exception] | tuple[type[Exception], ...] = (),
**decomp_args: Any, # These are passed to decomp_factory. **decomp_args: Any, # These are passed to decomp_factory.
) -> None: ... ) -> None: ...

View File

@ -32,7 +32,8 @@ class HTMLParser(ParserBase):
# Added in Python 3.9.23, 3.10.18, 3.11.13, 3.12.11, 3.13.6 # Added in Python 3.9.23, 3.10.18, 3.11.13, 3.12.11, 3.13.6
RCDATA_CONTENT_ELEMENTS: Final[tuple[str, ...]] RCDATA_CONTENT_ELEMENTS: Final[tuple[str, ...]]
def __init__(self, *, convert_charrefs: bool = True) -> None: # `scripting` parameter added in Python 3.9.25, 3.10.20, 3.11.15, 3.12.13, 3.13.10, 3.14.1
def __init__(self, *, convert_charrefs: bool = True, scripting: bool = False) -> None:
"""Initialize and reset this instance. """Initialize and reset this instance.
If convert_charrefs is True (the default), all character references If convert_charrefs is True (the default), all character references

View File

@ -309,6 +309,7 @@ class HTTPResponse(io.BufferedIOBase, BinaryIO): # type: ignore[misc] # incomp
def begin(self) -> None: ... def begin(self) -> None: ...
class HTTPConnection: class HTTPConnection:
blocksize: int
auto_open: int # undocumented auto_open: int # undocumented
debuglevel: int debuglevel: int
default_port: int # undocumented default_port: int # undocumented

View File

@ -85,6 +85,7 @@ class IMAP4:
class error(Exception): ... class error(Exception): ...
class abort(error): ... class abort(error): ...
class readonly(abort): ... class readonly(abort): ...
utf8_enabled: bool
mustquote: Pattern[str] mustquote: Pattern[str]
debug: int debug: int
state: str state: str

View File

@ -14,7 +14,9 @@ from importlib._bootstrap_external import (
spec_from_file_location as spec_from_file_location, spec_from_file_location as spec_from_file_location,
) )
from importlib.abc import Loader from importlib.abc import Loader
from typing_extensions import ParamSpec, deprecated from types import TracebackType
from typing import Literal
from typing_extensions import ParamSpec, Self, deprecated
_P = ParamSpec("_P") _P = ParamSpec("_P")
@ -99,6 +101,49 @@ class LazyLoader(Loader):
def source_hash(source_bytes: ReadableBuffer) -> bytes: def source_hash(source_bytes: ReadableBuffer) -> bytes:
"""Return the hash of *source_bytes* as used in hash-based pyc files.""" """Return the hash of *source_bytes* as used in hash-based pyc files."""
if sys.version_info >= (3, 12):
class _incompatible_extension_module_restrictions:
"""A context manager that can temporarily skip the compatibility check.
NOTE: This function is meant to accommodate an unusual case; one
which is likely to eventually go away. There's is a pretty good
chance this is not what you were looking for.
WARNING: Using this function to disable the check can lead to
unexpected behavior and even crashes. It should only be used during
extension module development.
If "disable_check" is True then the compatibility check will not
happen while the context manager is active. Otherwise the check
*will* happen.
Normally, extensions that do not support multiple interpreters
may not be imported in a subinterpreter. That implies modules
that do not implement multi-phase init or that explicitly of out.
Likewise for modules import in a subinterpreter with its own GIL
when the extension does not support a per-interpreter GIL. This
implies the module does not have a Py_mod_multiple_interpreters slot
set to Py_MOD_PER_INTERPRETER_GIL_SUPPORTED.
In both cases, this context manager may be used to temporarily
disable the check for compatible extension modules.
You can get the same effect as this function by implementing the
basic interface of multi-phase init (PEP 489) and lying about
support for multiple interpreters (or per-interpreter GIL).
"""
def __init__(self, *, disable_check: bool) -> None: ...
disable_check: bool
old: Literal[-1, 0, 1] # exists only while entered
def __enter__(self) -> Self: ...
def __exit__(
self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None
) -> None: ...
@property
def override(self) -> Literal[-1, 1]: ... # undocumented
if sys.version_info >= (3, 14): if sys.version_info >= (3, 14):
__all__ = [ __all__ = [
"LazyLoader", "LazyLoader",

View File

@ -251,6 +251,10 @@ def currency(val: float | Decimal, symbol: bool = True, grouping: bool = False,
def delocalize(string: _str) -> _str: def delocalize(string: _str) -> _str:
"""Parses a string as a normalized number according to the locale settings.""" """Parses a string as a normalized number according to the locale settings."""
if sys.version_info >= (3, 10):
def localize(string: _str, grouping: bool = False, monetary: bool = False) -> _str:
"""Parses a string as locale number according to the locale settings."""
def atof(string: _str, func: Callable[[_str], float] = ...) -> float: def atof(string: _str, func: Callable[[_str], float] = ...) -> float:
"""Parses a string as a float according to the locale settings.""" """Parses a string as a float according to the locale settings."""

View File

@ -64,10 +64,22 @@ from typing import (
runtime_checkable, runtime_checkable,
type_check_only, type_check_only,
) )
from typing_extensions import Self, TypeAlias, Unpack, deprecated from typing_extensions import LiteralString, Self, TypeAlias, Unpack, deprecated
from . import path as _path from . import path as _path
# Re-export common definitions from os.path to reduce duplication
from .path import (
altsep as altsep,
curdir as curdir,
defpath as defpath,
devnull as devnull,
extsep as extsep,
pardir as pardir,
pathsep as pathsep,
sep as sep,
)
__all__ = [ __all__ = [
"F_OK", "F_OK",
"O_APPEND", "O_APPEND",
@ -697,19 +709,8 @@ if sys.platform != "win32":
ST_NOSUID: Final[int] ST_NOSUID: Final[int]
ST_RDONLY: Final[int] ST_RDONLY: Final[int]
curdir: str
pardir: str
sep: str
if sys.platform == "win32":
altsep: str
else:
altsep: str | None
extsep: str
pathsep: str
defpath: str
linesep: Literal["\n", "\r\n"] linesep: Literal["\n", "\r\n"]
devnull: str name: LiteralString
name: str
F_OK: Final = 0 F_OK: Final = 0
R_OK: Final = 4 R_OK: Final = 4

View File

@ -17,10 +17,10 @@ def sequence2st(sequence: Sequence[Any]) -> STType:
def tuple2st(sequence: Sequence[Any]) -> STType: def tuple2st(sequence: Sequence[Any]) -> STType:
"""Creates an ST object from a tree representation.""" """Creates an ST object from a tree representation."""
def st2list(st: STType, line_info: bool = ..., col_info: bool = ...) -> list[Any]: def st2list(st: STType, line_info: bool = False, col_info: bool = False) -> list[Any]:
"""Creates a list-tree representation of an ST.""" """Creates a list-tree representation of an ST."""
def st2tuple(st: STType, line_info: bool = ..., col_info: bool = ...) -> tuple[Any, ...]: def st2tuple(st: STType, line_info: bool = False, col_info: bool = False) -> tuple[Any, ...]:
"""Creates a tuple-tree representation of an ST.""" """Creates a tuple-tree representation of an ST."""
def compilest(st: STType, filename: StrOrBytesPath = ...) -> CodeType: def compilest(st: STType, filename: StrOrBytesPath = ...) -> CodeType:
@ -48,8 +48,8 @@ class STType:
def issuite(self) -> bool: def issuite(self) -> bool:
"""Determines if this ST object was created from a suite.""" """Determines if this ST object was created from a suite."""
def tolist(self, line_info: bool = ..., col_info: bool = ...) -> list[Any]: def tolist(self, line_info: bool = False, col_info: bool = False) -> list[Any]:
"""Creates a list-tree representation of this ST.""" """Creates a list-tree representation of this ST."""
def totuple(self, line_info: bool = ..., col_info: bool = ...) -> tuple[Any, ...]: def totuple(self, line_info: bool = False, col_info: bool = False) -> tuple[Any, ...]:
"""Creates a tuple-tree representation of this ST.""" """Creates a tuple-tree representation of this ST."""

View File

@ -8,8 +8,8 @@ import sys
from _typeshed import FileDescriptorLike from _typeshed import FileDescriptorLike
from collections.abc import Iterable from collections.abc import Iterable
from types import TracebackType from types import TracebackType
from typing import Any, ClassVar, Final, final from typing import Any, ClassVar, Final, TypeVar, final
from typing_extensions import Self from typing_extensions import Never, Self
if sys.platform != "win32": if sys.platform != "win32":
PIPE_BUF: Final[int] PIPE_BUF: Final[int]
@ -43,9 +43,13 @@ if sys.platform != "win32":
def unregister(self, fd: FileDescriptorLike, /) -> None: ... def unregister(self, fd: FileDescriptorLike, /) -> None: ...
def poll(self, timeout: float | None = None, /) -> list[tuple[int, int]]: ... def poll(self, timeout: float | None = None, /) -> list[tuple[int, int]]: ...
_R = TypeVar("_R", default=Never)
_W = TypeVar("_W", default=Never)
_X = TypeVar("_X", default=Never)
def select( def select(
rlist: Iterable[Any], wlist: Iterable[Any], xlist: Iterable[Any], timeout: float | None = None, / rlist: Iterable[_R], wlist: Iterable[_W], xlist: Iterable[_X], timeout: float | None = None, /
) -> tuple[list[Any], list[Any], list[Any]]: ) -> tuple[list[_R], list[_W], list[_X]]:
"""Wait until one or more file descriptors are ready for some kind of I/O. """Wait until one or more file descriptors are ready for some kind of I/O.
The first three arguments are iterables of file descriptors to be waited for: The first three arguments are iterables of file descriptors to be waited for:

View File

@ -123,6 +123,9 @@ from typing_extensions import Never, Self, TypeAlias, deprecated
if sys.version_info >= (3, 13): if sys.version_info >= (3, 13):
from _ssl import HAS_PSK as HAS_PSK from _ssl import HAS_PSK as HAS_PSK
if sys.version_info >= (3, 14):
from _ssl import HAS_PHA as HAS_PHA
if sys.version_info < (3, 12): if sys.version_info < (3, 12):
from _ssl import RAND_pseudo_bytes as RAND_pseudo_bytes from _ssl import RAND_pseudo_bytes as RAND_pseudo_bytes

View File

@ -4,9 +4,116 @@ Suggested usage: from stat import *
""" """
import sys import sys
from _stat import * from _stat import (
S_ENFMT as S_ENFMT,
S_IEXEC as S_IEXEC,
S_IFBLK as S_IFBLK,
S_IFCHR as S_IFCHR,
S_IFDIR as S_IFDIR,
S_IFDOOR as S_IFDOOR,
S_IFIFO as S_IFIFO,
S_IFLNK as S_IFLNK,
S_IFMT as S_IFMT,
S_IFPORT as S_IFPORT,
S_IFREG as S_IFREG,
S_IFSOCK as S_IFSOCK,
S_IFWHT as S_IFWHT,
S_IMODE as S_IMODE,
S_IREAD as S_IREAD,
S_IRGRP as S_IRGRP,
S_IROTH as S_IROTH,
S_IRUSR as S_IRUSR,
S_IRWXG as S_IRWXG,
S_IRWXO as S_IRWXO,
S_IRWXU as S_IRWXU,
S_ISBLK as S_ISBLK,
S_ISCHR as S_ISCHR,
S_ISDIR as S_ISDIR,
S_ISDOOR as S_ISDOOR,
S_ISFIFO as S_ISFIFO,
S_ISGID as S_ISGID,
S_ISLNK as S_ISLNK,
S_ISPORT as S_ISPORT,
S_ISREG as S_ISREG,
S_ISSOCK as S_ISSOCK,
S_ISUID as S_ISUID,
S_ISVTX as S_ISVTX,
S_ISWHT as S_ISWHT,
S_IWGRP as S_IWGRP,
S_IWOTH as S_IWOTH,
S_IWRITE as S_IWRITE,
S_IWUSR as S_IWUSR,
S_IXGRP as S_IXGRP,
S_IXOTH as S_IXOTH,
S_IXUSR as S_IXUSR,
SF_APPEND as SF_APPEND,
SF_ARCHIVED as SF_ARCHIVED,
SF_IMMUTABLE as SF_IMMUTABLE,
SF_NOUNLINK as SF_NOUNLINK,
SF_SNAPSHOT as SF_SNAPSHOT,
ST_ATIME as ST_ATIME,
ST_CTIME as ST_CTIME,
ST_DEV as ST_DEV,
ST_GID as ST_GID,
ST_INO as ST_INO,
ST_MODE as ST_MODE,
ST_MTIME as ST_MTIME,
ST_NLINK as ST_NLINK,
ST_SIZE as ST_SIZE,
ST_UID as ST_UID,
UF_APPEND as UF_APPEND,
UF_COMPRESSED as UF_COMPRESSED,
UF_HIDDEN as UF_HIDDEN,
UF_IMMUTABLE as UF_IMMUTABLE,
UF_NODUMP as UF_NODUMP,
UF_NOUNLINK as UF_NOUNLINK,
UF_OPAQUE as UF_OPAQUE,
filemode as filemode,
)
from typing import Final from typing import Final
if sys.platform == "win32":
from _stat import (
IO_REPARSE_TAG_APPEXECLINK as IO_REPARSE_TAG_APPEXECLINK,
IO_REPARSE_TAG_MOUNT_POINT as IO_REPARSE_TAG_MOUNT_POINT,
IO_REPARSE_TAG_SYMLINK as IO_REPARSE_TAG_SYMLINK,
)
if sys.version_info >= (3, 13):
from _stat import (
SF_DATALESS as SF_DATALESS,
SF_FIRMLINK as SF_FIRMLINK,
SF_SETTABLE as SF_SETTABLE,
UF_DATAVAULT as UF_DATAVAULT,
UF_SETTABLE as UF_SETTABLE,
UF_TRACKED as UF_TRACKED,
)
if sys.platform == "darwin":
from _stat import SF_SUPPORTED as SF_SUPPORTED, SF_SYNTHETIC as SF_SYNTHETIC
# _stat.c defines FILE_ATTRIBUTE_* constants conditionally,
# making them available only at runtime on Windows.
# stat.py unconditionally redefines the same FILE_ATTRIBUTE_* constants
# on all platforms.
FILE_ATTRIBUTE_ARCHIVE: Final = 32
FILE_ATTRIBUTE_COMPRESSED: Final = 2048
FILE_ATTRIBUTE_DEVICE: Final = 64
FILE_ATTRIBUTE_DIRECTORY: Final = 16
FILE_ATTRIBUTE_ENCRYPTED: Final = 16384
FILE_ATTRIBUTE_HIDDEN: Final = 2
FILE_ATTRIBUTE_INTEGRITY_STREAM: Final = 32768
FILE_ATTRIBUTE_NORMAL: Final = 128
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: Final = 8192
FILE_ATTRIBUTE_NO_SCRUB_DATA: Final = 131072
FILE_ATTRIBUTE_OFFLINE: Final = 4096
FILE_ATTRIBUTE_READONLY: Final = 1
FILE_ATTRIBUTE_REPARSE_POINT: Final = 1024
FILE_ATTRIBUTE_SPARSE_FILE: Final = 512
FILE_ATTRIBUTE_SYSTEM: Final = 4
FILE_ATTRIBUTE_TEMPORARY: Final = 256
FILE_ATTRIBUTE_VIRTUAL: Final = 65536
if sys.version_info >= (3, 13): if sys.version_info >= (3, 13):
# https://github.com/python/cpython/issues/114081#issuecomment-2119017790 # https://github.com/python/cpython/issues/114081#issuecomment-2119017790
SF_RESTRICTED: Final = 0x00080000 SF_RESTRICTED: Final = 0x00080000

View File

@ -763,6 +763,8 @@ def intern(string: str, /) -> str:
the previously interned string object with the same value. the previously interned string object with the same value.
""" """
__interactivehook__: Callable[[], object]
if sys.version_info >= (3, 13): if sys.version_info >= (3, 13):
def _is_gil_enabled() -> bool: def _is_gil_enabled() -> bool:
"""Return True if the GIL is currently enabled and False otherwise.""" """Return True if the GIL is currently enabled and False otherwise."""

View File

@ -17,6 +17,10 @@ PROFILER_ID: Final = 2
OPTIMIZER_ID: Final = 5 OPTIMIZER_ID: Final = 5
def use_tool_id(tool_id: int, name: str, /) -> None: ... def use_tool_id(tool_id: int, name: str, /) -> None: ...
if sys.version_info >= (3, 14):
def clear_tool_id(tool_id: int, /) -> None: ...
def free_tool_id(tool_id: int, /) -> None: ... def free_tool_id(tool_id: int, /) -> None: ...
def get_tool(tool_id: int, /) -> str | None: ... def get_tool(tool_id: int, /) -> str | None: ...
@ -43,10 +47,10 @@ class _events:
STOP_ITERATION: Final[int] STOP_ITERATION: Final[int]
if sys.version_info >= (3, 14): if sys.version_info >= (3, 14):
BRANCH_LEFT: Final[int] BRANCH_LEFT: Final[int]
BRANCH_TAKEN: Final[int] BRANCH_RIGHT: Final[int]
@property @property
@deprecated("Deprecated since Python 3.14. Use `BRANCH_LEFT` or `BRANCH_TAKEN` instead.") @deprecated("Deprecated since Python 3.14. Use `BRANCH_LEFT` or `BRANCH_RIGHT` instead.")
def BRANCH(self) -> int: ... def BRANCH(self) -> int: ...
else: else:

View File

@ -2,7 +2,7 @@
import _thread import _thread
import sys import sys
from _thread import _excepthook, _ExceptHookArgs, get_native_id as get_native_id from _thread import _ExceptHookArgs, get_native_id as get_native_id
from _typeshed import ProfileFunction, TraceFunction from _typeshed import ProfileFunction, TraceFunction
from collections.abc import Callable, Iterable, Mapping from collections.abc import Callable, Iterable, Mapping
from contextvars import ContextVar from contextvars import ContextVar
@ -647,7 +647,9 @@ class Event:
""" """
excepthook = _excepthook excepthook: Callable[[_ExceptHookArgs], object]
if sys.version_info >= (3, 10):
__excepthook__: Callable[[_ExceptHookArgs], object]
ExceptHookArgs = _ExceptHookArgs ExceptHookArgs = _ExceptHookArgs
class Timer(Thread): class Timer(Thread):

View File

@ -957,9 +957,10 @@ if sys.version_info >= (3, 10):
class EllipsisType: class EllipsisType:
"""The type of the Ellipsis singleton.""" """The type of the Ellipsis singleton."""
from builtins import _NotImplementedType @final
class NotImplementedType(Any):
"""The type of the NotImplemented singleton."""
NotImplementedType = _NotImplementedType
@final @final
class UnionType: class UnionType:
"""Represent a union type """Represent a union type

View File

@ -328,10 +328,6 @@ class TypeVar:
@property @property
def evaluate_default(self) -> EvaluateFunc | None: ... def evaluate_default(self) -> EvaluateFunc | None: ...
# Used for an undocumented mypy feature. Does not exist at runtime.
# Obsolete, use _typeshed._type_checker_internals.promote instead.
_promote = object()
# N.B. Keep this definition in sync with typing_extensions._SpecialForm # N.B. Keep this definition in sync with typing_extensions._SpecialForm
@final @final
class _SpecialForm(_Final): class _SpecialForm(_Final):

View File

@ -1,11 +1,28 @@
"""Various utility functions.""" """Various utility functions."""
from collections.abc import MutableSequence, Sequence from collections.abc import MutableSequence, Sequence
from typing import Any, Final, TypeVar from typing import Any, Final, Literal, Protocol, TypeVar, type_check_only
from typing_extensions import TypeAlias from typing_extensions import TypeAlias
@type_check_only
class _SupportsDunderLT(Protocol):
def __lt__(self, other: Any, /) -> bool: ...
@type_check_only
class _SupportsDunderGT(Protocol):
def __gt__(self, other: Any, /) -> bool: ...
@type_check_only
class _SupportsDunderLE(Protocol):
def __le__(self, other: Any, /) -> bool: ...
@type_check_only
class _SupportsDunderGE(Protocol):
def __ge__(self, other: Any, /) -> bool: ...
_T = TypeVar("_T") _T = TypeVar("_T")
_Mismatch: TypeAlias = tuple[_T, _T, int] _Mismatch: TypeAlias = tuple[_T, _T, int]
_SupportsComparison: TypeAlias = _SupportsDunderLE | _SupportsDunderGE | _SupportsDunderGT | _SupportsDunderLT
_MAX_LENGTH: Final = 80 _MAX_LENGTH: Final = 80
_PLACEHOLDER_LEN: Final = 12 _PLACEHOLDER_LEN: Final = 12
@ -35,7 +52,7 @@ def unorderable_list_difference(expected: MutableSequence[_T], actual: MutableSe
has O(n*n) performance. has O(n*n) performance.
""" """
def three_way_cmp(x: Any, y: Any) -> int: def three_way_cmp(x: _SupportsComparison, y: _SupportsComparison) -> Literal[-1, 0, 1]:
"""Return -1 if x < y, 0 if x == y and 1 if x > y""" """Return -1 if x < y, 0 if x == y and 1 if x > y"""
def _count_diff_all_purpose(actual: Sequence[_T], expected: Sequence[_T]) -> list[_Mismatch[_T]]: def _count_diff_all_purpose(actual: Sequence[_T], expected: Sequence[_T]) -> list[_Mismatch[_T]]:

View File

@ -58,8 +58,9 @@ Typical usage:
import builtins import builtins
import sys import sys
from _typeshed import Unused
from enum import Enum from enum import Enum
from typing import Final from typing import Final, NoReturn
from typing_extensions import LiteralString, TypeAlias from typing_extensions import LiteralString, TypeAlias
_FieldsType: TypeAlias = tuple[int, int, int, int, int, int] _FieldsType: TypeAlias = tuple[int, int, int, int, int, int]
@ -134,6 +135,9 @@ class UUID:
""" """
__slots__ = ("int", "is_safe", "__weakref__") __slots__ = ("int", "is_safe", "__weakref__")
is_safe: Final[SafeUUID]
int: Final[builtins.int]
def __init__( def __init__(
self, self,
hex: str | None = None, hex: str | None = None,
@ -174,8 +178,6 @@ class UUID:
for multiprocessing applications, via uuid_generate_time_safe(3). for multiprocessing applications, via uuid_generate_time_safe(3).
""" """
@property
def is_safe(self) -> SafeUUID: ...
@property @property
def bytes(self) -> builtins.bytes: ... def bytes(self) -> builtins.bytes: ...
@property @property
@ -191,8 +193,6 @@ class UUID:
@property @property
def hex(self) -> str: ... def hex(self) -> str: ...
@property @property
def int(self) -> builtins.int: ...
@property
def node(self) -> builtins.int: ... def node(self) -> builtins.int: ...
@property @property
def time(self) -> builtins.int: ... def time(self) -> builtins.int: ...
@ -215,6 +215,7 @@ class UUID:
def __gt__(self, other: UUID) -> bool: ... def __gt__(self, other: UUID) -> bool: ...
def __ge__(self, other: UUID) -> bool: ... def __ge__(self, other: UUID) -> bool: ...
def __hash__(self) -> builtins.int: ... def __hash__(self) -> builtins.int: ...
def __setattr__(self, name: Unused, value: Unused) -> NoReturn: ...
def getnode() -> int: def getnode() -> int:
"""Get the hardware address as a 48-bit positive integer. """Get the hardware address as a 48-bit positive integer.

View File

@ -238,7 +238,7 @@ if sys.platform == "win32":
tree. tree.
""" """
def OpenKey(key: _KeyType, sub_key: str, reserved: int = 0, access: int = 131097) -> HKEYType: def OpenKey(key: _KeyType, sub_key: str | None, reserved: int = 0, access: int = 131097) -> HKEYType:
"""Opens the specified key. """Opens the specified key.
key key
@ -255,7 +255,7 @@ if sys.platform == "win32":
If the function fails, an OSError exception is raised. If the function fails, an OSError exception is raised.
""" """
def OpenKeyEx(key: _KeyType, sub_key: str, reserved: int = 0, access: int = 131097) -> HKEYType: def OpenKeyEx(key: _KeyType, sub_key: str | None, reserved: int = 0, access: int = 131097) -> HKEYType:
"""Opens the specified key. """Opens the specified key.
key key
@ -336,7 +336,7 @@ if sys.platform == "win32":
to the API. to the API.
""" """
def SetValue(key: _KeyType, sub_key: str, type: int, value: str, /) -> None: def SetValue(key: _KeyType, sub_key: str | None, type: int, value: str, /) -> None:
"""Associates a value with a specified key. """Associates a value with a specified key.
key key