[red-knot] Document public symbol type inference#15766
Conversation
Adds a slightly more comprehensive documentation of our behavior regarding type inference for public uses of symbols. In particular: - What public type do we infer for `x: int = any()`? - What public type do we infer for `x: Unknown = 1`?
| reveal_type(a) # revealed: Unknown | Literal[1] | ||
| reveal_type(b) # revealed: Unknown |
There was a problem hiding this comment.
This behavior is the main thing I wanted to document.
| a = 1 | ||
|
|
||
| # Declared with `Unknown`: | ||
| b: Unknown = 1 |
There was a problem hiding this comment.
I think something that is noteworthy here is that the entire purpose of Unknown (as distinct from Any) is to distinguish a dynamic type that originates from an explicit annotation vs one that originates from lack of annotation. So the whole idea of "declared with Unknown" is a contradiction. We have made it possible by introducing knot_extensions.Unknown, but perhaps that is just confusing and was a mistake? It should really only be used in tests, but I would guess that in most cases we could structure the test so as to generate an Unknown type via lack-of-annotation instead (e.g. an un-annotated function parameter).
There was a problem hiding this comment.
Actually I just realized that "declared with Unknown" is not a contradiction; it could occur anytime someone annotates with a name we can't resolve, or an invalid type expression.
Still not totally clear to me whether tests for this case are better written using knot_extensions.Unknown (which is clear and explicit, but not "realistic") or using an actual unknown name (which then requires suppressing the unknown-name diagnostic.) I can see good arguments both ways, so no strong feelings.
* main: Run `cargo update` (#15769) [red-knot] Document public symbol type inferece (#15766) Update dawidd6/action-download-artifact action to v8 (#15760) Update NPM Development dependencies (#15758) Update pre-commit dependencies (#15756) Update dependency ruff to v0.9.3 (#15755) Update dependency mdformat-mkdocs to v4.1.2 (#15754) Update Rust crate uuid to v1.12.1 (#15753) Update Rust crate unicode-ident to v1.0.15 (#15752) Fix docstring in ruff_annotate_snippets (#15748) Update Rust crate insta to v1.42.1 (#15751) Update Rust crate clap to v4.5.27 (#15750) Add references to `trio.run_process` and `anyio.run_process` (#15761) [`ruff`] Do not emit diagnostic when all arguments to `zip()` are variadic (`RUF058`) (#15744) [red-knot] Ensure differently ordered unions are considered equivalent when they appear inside tuples inside top-level intersections (#15743) [red-knot] Ensure differently ordered unions and intersections are understood as equivalent even inside arbitrarily nested tuples (#15740) [red-knot] Promote the `all_type_pairs_are_assignable_to_their_union` property test to stable (#15739) [`pylint`] Do not trigger `PLR6201` on empty collections (#15732) Improve the file watching failure error message (#15728) Speed symbol state merging back up (#15731)
…15787) ## Summary Do not use an explict `knot_extensions.Unknown` declaration, as per [this comment](#15766 (comment)). Instead, use an undefined name to achieve the same effect.
Summary
Adds a slightly more comprehensive documentation of our behavior regarding type inference for public uses of symbols. In particular:
x: int = any()?x: Unknown = 1?