Python Forum

Full Version: mypy, type aliases and type variables
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I'm not sure, whether it's a good place to ask such question. If it's not, please tell me, where it suits better.

I use Python 3.11/3.12, and mypy 1.6.0.

Here's the code:

from typing import TypeVar, Callable

T = TypeVar('T')

# type alias, for Python 3.11
IntToSomething = Callable[ [int], T ]

def callPlusOne(f : IntToSomething, val : int) -> T:
  return f(val+1)

def prettyInt(val : int) -> str:
  return f'Your pretty number is {val}'

print( callPlusOne(prettyInt, 10) )
It's perfectly fine, and can be run without any problems. mypy finds it incorrect, though (it's about the callPlusOne function):

Output:
error: A function returning TypeVar should receive at least one argument containing the same TypeVar [type-var]
The solution (?) is to get rid of type alias (who needs them, anyway? Wink ):

from typing import TypeVar, Callable

T = TypeVar('T')

def callPlusOne(f : Callable[ [int], T ], val : int) -> T:
  return f(val+1)

def prettyInt(val : int) -> str:
  return f'Your pretty number is {val}'

print( callPlusOne(prettyInt, 10) )
No type alias used, no problem for mypy. And anyone is happy. Well, anyone but me: I'd like to use type aliases, since they make my code more readable.

Am I missing something, or mypy has some problems with type parameters in type aliases?
The documentation for typing states:

Quote:NOTE: in Python 3.5 and later, the typing module lives in the stdlib, and installing this package has NO EFFECT, because stdlib takes higher precedence than the installation directory. To get a newer version of the typing module in Python 3.5 or later, you have to upgrade to a newer Python (bugfix) version. For example, typing in Python 3.6.0 is missing the definition of ‘Type’ – upgrading to 3.6.2 will fix this.

Since you are using python 3.11, it has no effect and therefore should not be imported.