Support for alternative generic inference algorithms
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 1.8k
- Forks
- 302
- Avg merge
- 23h
- Merged PRs (30d)
- 8
Description
I believe there is a use case for generic inference that doesn't get as wide as possible.
Look at this example of an assertion function, you would never want to do an assertion between two different types, but there is currently no way to type this:
from typing import TypeVar
T = TypeVar("T")
def assert_something(expected: T, actual: T) -> None:
...
assert_something(1, "") # no error, SUS alert!, T is inferred as `object`
Here are some behaviors from other languages
TypeScript
In Typescript generic inference is narrowed to type level types(not down to instance level types) and is never widened:
function assertSomething<T>(expected: T, actual: T): void { ... }
assertSomething(1, "") // Argument of type 'string' is not assignable to parameter of type 'number'.
Kotlin
Kotlin by default acts the same as Python, but there are annotations for changing the behavior of inference.
NoInfer will exclude that usage from inferring the type.
fun <T> assertSomething(expected: T, actual: @NoInfer T) { }
assertSomething(1, "") // Type mismatch: inferred type is String but Int was expected
Exact will require the type of the parameter is equal at a type level (Number != Int)
fun <T> foo(x: @Exact T) { }
foo<Number>(1) // Type mismatch. Required: Number, Found: Int
OnlyInputTypes will require a type annotation if there is any difference in types between the usages of the generic:
fun <@OnlyInputTypes T> doSomething(a: T, b: T) { }
val a = doSomething("a", "b")
val b = doSomething("a", 1) // Type inference failed. The value of the type parameter T should be mentioned in input types (argument types, receiver type or expected type). Try to specify it explicitly.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by comparing the Python example with the TypeScript and Kotlin inference behaviors described in the issue. Define which alternative inference algorithms or annotations should be supported and how mixed argument types, exact types, and excluded inference are expected to behave; completion would require an agreed design and corresponding typing specification.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100