Skip to content

Commit 0636c9d

Browse files
committed
render types: render -> None in callables
1 parent c126c48 commit 0636c9d

8 files changed

+9431
-13415
lines changed

.mypy/baseline.json

Lines changed: 9378 additions & 13372 deletions
Large diffs are not rendered by default.

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
### Enhancements
55
- Similar errors on the same line will now not be removed
66
- Render generic upper bound with `: ` instead of ` <: `
7+
- Render uninhabited type as `Never` instead of `<nothing>`
8+
- Render Callables with `-> None`
79
### Fixes
810
- Handle positional only `/` parameters in overload implementation inference
911
- Render inferred literal without `?`

mypy/types.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3062,6 +3062,8 @@ def visit_callable_type(self, t: CallableType) -> str:
30623062
s += f" -> TypeGuard[{t.type_guard.accept(self)}]"
30633063
else:
30643064
s += f" -> {t.ret_type.accept(self)}"
3065+
elif mypy.options._based:
3066+
s += " -> None"
30653067

30663068
s = self.render_callable_type_params(t, lambda x: x.accept(self)) + s
30673069

test-data/unit/check-based-default-return.test

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@
33

44
[case testSimple]
55
def f(): ...
6-
reveal_type(f) # N: Revealed type is "def ()"
6+
reveal_type(f) # N: Revealed type is "def () -> None"
77
reveal_type(f()) # N: Revealed type is "None"
88

99
def g(i: int): ...
10-
reveal_type(g) # N: Revealed type is "def (i: int)"
10+
reveal_type(g) # N: Revealed type is "def (i: int) -> None"
1111

1212
class A:
1313
def f(self): ...
1414
def g(self, i: int): ...
1515

16-
reveal_type(A.f) # N: Revealed type is "def (self: __main__.A)"
17-
reveal_type(A.g) # N: Revealed type is "def (self: __main__.A, i: int)"
16+
reveal_type(A.f) # N: Revealed type is "def (self: __main__.A) -> None"
17+
reveal_type(A.g) # N: Revealed type is "def (self: __main__.A, i: int) -> None"
1818

1919

2020
[case testUntypedDefs]
@@ -24,7 +24,7 @@ def f(): ...
2424
reveal_type(f) # N: Revealed type is "def () -> Untyped"
2525

2626
def g(i: int): ...
27-
reveal_type(g) # N: Revealed type is "def (i: int)"
27+
reveal_type(g) # N: Revealed type is "def (i: int) -> None"
2828

2929
def h(i: int, j): ... # E: Function is missing a type annotation for one or more arguments [no-untyped-def]
3030

@@ -36,8 +36,8 @@ class A:
3636

3737
reveal_type(A.f) # N: Revealed type is "def (self: __main__.A) -> Untyped"
3838
reveal_type(A.g) # N: Revealed type is "def (self: __main__.A, i: Untyped) -> Untyped"
39-
reveal_type(A.h) # N: Revealed type is "def (self: __main__.A, i: int)"
40-
reveal_type(A.i) # N: Revealed type is "def (self: __main__.A, i: int, j: Untyped)"
39+
reveal_type(A.h) # N: Revealed type is "def (self: __main__.A, i: int) -> None"
40+
reveal_type(A.i) # N: Revealed type is "def (self: __main__.A, i: int, j: Untyped) -> None"
4141

4242

4343
[case testIncompleteDefs]
@@ -47,7 +47,7 @@ def f(i): ...
4747
reveal_type(f) # N: Revealed type is "def (i: Untyped) -> Untyped"
4848

4949
def g(i: int, j): ...
50-
reveal_type(g) # N: Revealed type is "def (i: int, j: Untyped)"
50+
reveal_type(g) # N: Revealed type is "def (i: int, j: Untyped) -> None"
5151

5252
class A:
5353
def f(self): ...
@@ -57,8 +57,8 @@ class A:
5757

5858
reveal_type(A.f) # N: Revealed type is "def (self: __main__.A) -> Untyped"
5959
reveal_type(A.g) # N: Revealed type is "def (self: __main__.A, i: Untyped) -> Untyped"
60-
reveal_type(A.h) # N: Revealed type is "def (self: __main__.A, i: int)"
61-
reveal_type(A.i) # N: Revealed type is "def (self: __main__.A, i: int, j: Untyped)"
60+
reveal_type(A.h) # N: Revealed type is "def (self: __main__.A, i: int) -> None"
61+
reveal_type(A.i) # N: Revealed type is "def (self: __main__.A, i: int, j: Untyped) -> None"
6262

6363

6464
[case testGenerator]
@@ -144,15 +144,15 @@ class A:
144144
def f(self, i: int): ...
145145
def f(self, i: int = 0): ...
146146

147-
reveal_type(A.f) # N: Revealed type is "Overload(def (self: __main__.A), def (self: __main__.A, i: int))"
147+
reveal_type(A.f) # N: Revealed type is "Overload(def (self: __main__.A) -> None, def (self: __main__.A, i: int) -> None)"
148148

149149
@overload
150150
def f(): ...
151151
@overload
152152
def f(i: int): ...
153153
def f(i: int = 0): ...
154154

155-
reveal_type(f) # N: Revealed type is "Overload(def (), def (i: int))"
155+
reveal_type(f) # N: Revealed type is "Overload(def () -> None, def (i: int) -> None)"
156156

157157

158158
[case testOverloadIncomplete]
@@ -168,7 +168,7 @@ class A:
168168
def f(self, i, j: int): ...
169169
def f(self, i: int = 0, j: int = 0): ...
170170

171-
reveal_type(A.f) # N: Revealed type is "Overload(def (self: __main__.A), def (self: __main__.A, i: Untyped), def (self: __main__.A, i: Untyped, j: int))"
171+
reveal_type(A.f) # N: Revealed type is "Overload(def (self: __main__.A) -> None, def (self: __main__.A, i: Untyped) -> None, def (self: __main__.A, i: Untyped, j: int) -> None)"
172172

173173
@overload
174174
def f(): ...
@@ -178,7 +178,7 @@ def f(i): ...
178178
def f(i, j: int): ...
179179
def f(i: int = 0, j: int = 0): ...
180180

181-
reveal_type(f) # N: Revealed type is "Overload(def (), def (i: Untyped), def (i: Untyped, j: int))"
181+
reveal_type(f) # N: Revealed type is "Overload(def () -> None, def (i: Untyped) -> None, def (i: Untyped, j: int) -> None)"
182182

183183

184184
[case testOverloadUntyped]
@@ -194,7 +194,7 @@ class A:
194194
def f(self, *, j: int): ...
195195
def f(self, i: int = 0, j: int = 0): ...
196196

197-
reveal_type(A.f) # N: Revealed type is "Overload(def (self: __main__.A), def (self: __main__.A, i: Untyped), def (self: __main__.A, *, j: int))"
197+
reveal_type(A.f) # N: Revealed type is "Overload(def (self: __main__.A) -> None, def (self: __main__.A, i: Untyped) -> None, def (self: __main__.A, *, j: int) -> None)"
198198

199199
@overload
200200
def f(): ...
@@ -204,7 +204,7 @@ def f(i): ...
204204
def f(*, j: int): ...
205205
def f(i: int = 0, j: int = 0): ...
206206

207-
reveal_type(f) # N: Revealed type is "Overload(def (), def (i: Untyped), def (*, j: int))"
207+
reveal_type(f) # N: Revealed type is "Overload(def () -> None, def (i: Untyped) -> None, def (*, j: int) -> None)"
208208

209209
[case testOverloadOther]
210210
# flags: --allow-untyped-defs --allow-incomplete-defs --allow-any-expr
@@ -219,7 +219,7 @@ class A:
219219
def f(self, i, j: int): ...
220220
def f(self, i: int = 0, j: int = 0) -> object: ...
221221

222-
reveal_type(A.f) # N: Revealed type is "Overload(def (self: __main__.A) -> int, def (self: __main__.A, i: Untyped), def (self: __main__.A, i: Untyped, j: int))"
222+
reveal_type(A.f) # N: Revealed type is "Overload(def (self: __main__.A) -> int, def (self: __main__.A, i: Untyped) -> None, def (self: __main__.A, i: Untyped, j: int) -> None)"
223223

224224
class B:
225225
@overload
@@ -230,12 +230,12 @@ class B:
230230
def f(self, i, j: int) -> int: ...
231231
def f(self, i: int = 0, j: int = 0) -> object: ...
232232

233-
reveal_type(B.f) # N: Revealed type is "Overload(def (self: __main__.B) -> str, def (self: __main__.B, i: Untyped), def (self: __main__.B, i: Untyped, j: int) -> int)"
233+
reveal_type(B.f) # N: Revealed type is "Overload(def (self: __main__.B) -> str, def (self: __main__.B, i: Untyped) -> None, def (self: __main__.B, i: Untyped, j: int) -> int)"
234234

235235

236236
[case testNewHasError]
237237
# flags: --no-infer-function-types
238238
class A:
239239
def __new__(cls): ... # E: "__new__" must return a class instance (got "None") [misc]
240240

241-
reveal_type(A.__new__) # N: Revealed type is "def (cls: type[__main__.A])"
241+
reveal_type(A.__new__) # N: Revealed type is "def (cls: type[__main__.A]) -> None"

test-data/unit/check-based-incomplete-defs.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# flags: --config-file tmp/mypy.ini
33
from b import foo
44
foo(1, 2) # E: Call to incomplete function "foo" in typed context [no-untyped-call] \
5-
# N: Type is "def (a: int, b: Untyped)"
5+
# N: Type is "def (a: int, b: Untyped) -> None"
66

77
[file b.py]
88
def foo(a: int, b): ...

test-data/unit/check-based-infer-function-types.test

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ class B1(A1):
2020

2121
reveal_type(A1.__new__) # N: Revealed type is "def (cls: type[__main__.A1]) -> Untyped"
2222
reveal_type(B1.__new__) # N: Revealed type is "def (cls: type[__main__.B1]) -> Untyped"
23-
reveal_type(A1.__init__) # N: Revealed type is "def (self: __main__.A1)"
24-
reveal_type(B1.__init__) # N: Revealed type is "def (self: __main__.B1)"
23+
reveal_type(A1.__init__) # N: Revealed type is "def (self: __main__.A1) -> None"
24+
reveal_type(B1.__init__) # N: Revealed type is "def (self: __main__.B1) -> None"
2525

2626
class A2:
2727
def __new__(cls, a: int): ...
@@ -32,8 +32,8 @@ class B2(A2):
3232

3333
reveal_type(A2.__new__) # N: Revealed type is "def (cls: type[__main__.A2], a: int) -> __main__.A2"
3434
reveal_type(B2.__new__) # N: Revealed type is "def (cls: type[__main__.B2], a: int) -> __main__.B2"
35-
reveal_type(A2.__init__) # N: Revealed type is "def (self: __main__.A2, a: int)"
36-
reveal_type(B2.__init__) # N: Revealed type is "def (self: __main__.B2, a: int)"
35+
reveal_type(A2.__init__) # N: Revealed type is "def (self: __main__.A2, a: int) -> None"
36+
reveal_type(B2.__init__) # N: Revealed type is "def (self: __main__.B2, a: int) -> None"
3737

3838

3939
[case testInferFunctionTypesComplete-xfail]
@@ -46,8 +46,8 @@ class B1(A1):
4646

4747
reveal_type(A1.__new__) # N: Revealed type is "def (cls: type[__main__.A1]) -> __main__.A1"
4848
reveal_type(B1.__new__) # N: Revealed type is "def (cls: type[__main__.B1]) -> __main__.B1"
49-
reveal_type(A1.__init__) # N: Revealed type is "def (self: __main__.A1)"
50-
reveal_type(B1.__init__) # N: Revealed type is "def (self: __main__.B1)"
49+
reveal_type(A1.__init__) # N: Revealed type is "def (self: __main__.A1) -> None"
50+
reveal_type(B1.__init__) # N: Revealed type is "def (self: __main__.B1) -> None"
5151

5252
class A2:
5353
def __new__(cls, a: int): ...
@@ -58,21 +58,21 @@ class B2(A2):
5858

5959
reveal_type(A2.__new__) # N: Revealed type is "def (cls: type[__main__.A2], a: int) -> __main__.A2"
6060
reveal_type(B2.__new__) # N: Revealed type is "def (cls: type[__main__.B2], a: int) -> __main__.B2"
61-
reveal_type(A2.__init__) # N: Revealed type is "def (self: __main__.A2, a: int)"
62-
reveal_type(B2.__init__) # N: Revealed type is "def (self: __main__.B2, a: int)"
61+
reveal_type(A2.__init__) # N: Revealed type is "def (self: __main__.A2, a: int) -> None"
62+
reveal_type(B2.__init__) # N: Revealed type is "def (self: __main__.B2, a: int) -> None"
6363

6464

6565
[case testDefaultInstance-xfail]
6666
class A: ...
6767
def f(a=A()): ...
68-
reveal_type(f) # N: Revealed type is "def (a: __main__.A =)"
68+
reveal_type(f) # N: Revealed type is "def (a: __main__.A =) -> None"
6969

7070
class B:
7171
def foo(self, a: object): ...
7272
class C(B):
7373
def foo(self, a=A()): ...
7474

75-
reveal_type(C.foo) # N: Revealed type is "def (self: __main__.C, a: object =)"
75+
reveal_type(C.foo) # N: Revealed type is "def (self: __main__.C, a: object =) -> None"
7676

7777

7878
[case testDontInferFunctionTypes]
@@ -105,7 +105,7 @@ class B2(A2):
105105

106106
reveal_type(A2.__new__) # N: Revealed type is "def (cls: type[__main__.A2], a: int) -> Untyped"
107107
reveal_type(B2.__new__) # N: Revealed type is "def (cls: type[__main__.B2], a: Untyped) -> Untyped"
108-
reveal_type(A2.__init__) # N: Revealed type is "def (self: __main__.A2, a: int)"
108+
reveal_type(A2.__init__) # N: Revealed type is "def (self: __main__.A2, a: int) -> None"
109109
reveal_type(B2.__init__) # N: Revealed type is "def (self: __main__.B2, a: Untyped) -> Untyped"
110110

111111

@@ -169,7 +169,7 @@ def foo(a='1') -> None:
169169
def foo(a="1") -> None:
170170
reveal_type(a) # N: Revealed type is "int | str"
171171

172-
reveal_type(foo) # N: Revealed type is "Overload(def (a: int), def (a: str =))"
172+
reveal_type(foo) # N: Revealed type is "Overload(def (a: int) -> None, def (a: str =) -> None)"
173173

174174

175175
[case testOverloadMixedPositionalKeyword]
@@ -338,7 +338,7 @@ reveal_type(A.f) # N: Revealed type is "Overload(def (self: __main__.A, f: int)
338338
reveal_type(B.f) # N: Revealed type is "Overload(def (self: __main__.B, f: int) -> str, def (self: __main__.B, f: str) -> int)"
339339
reveal_type(C.f) # N: Revealed type is "Overload(def (self: __main__.C, f: int) -> str, def (self: __main__.C, f: str) -> int)"
340340
reveal_type(D.f) # N: Revealed type is "Overload(def (self: __main__.D, f: int) -> str, def (self: __main__.D, f: str) -> int)"
341-
reveal_type(E.f) # N: Revealed type is "def (self: __main__.E, f: str)"
341+
reveal_type(E.f) # N: Revealed type is "def (self: __main__.E, f: str) -> None"
342342
reveal_type(F.f) # N: Revealed type is "Overload(def (self: __main__.F, f: int) -> str, def (self: __main__.F, f: str) -> int)"
343343
reveal_type(G.f) # N: Revealed type is "Overload(def (self: __main__.G, f: int) -> str, def (self: __main__.G, f: str) -> int)"
344344

@@ -367,7 +367,7 @@ def bar(a=1) -> None:
367367
1 + "" # E: Unsupported operand types for + ("int" and "str") [operator]
368368

369369
bar()
370-
reveal_type(bar) # N: Revealed type is "def (a: int =)"
370+
reveal_type(bar) # N: Revealed type is "def (a: int =) -> None"
371371

372372

373373
[case inferPropertyTypes]
@@ -467,4 +467,4 @@ def deco(func: T) -> T: ...
467467
@deco
468468
def b(b=True) -> None: ...
469469

470-
reveal_type(b) # N: Revealed type is "def (b: bool =)"
470+
reveal_type(b) # N: Revealed type is "def (b: bool =) -> None"

test-data/unit/check-based-type-render.test

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
[case testGenericMethod]
22
from typing import TypeVar, Generic, Union
33

4-
T = TypeVar('T')
5-
T2 = TypeVar('T2')
4+
T = TypeVar('T', bound=str)
5+
T2 = TypeVar('T2', bound=int)
66

77
class A(Generic[T2]):
88
def f(self, t: T, t2: T2) -> Union[T, T2]:
@@ -12,10 +12,10 @@ class A(Generic[T2]):
1212
t = t2 # E: Incompatible types in assignment (expression has type "T2@A", variable has type "T@f") [assignment]
1313
return t
1414

15-
reveal_type(A.f) # N: Revealed type is "def [T2 (from A), T] (self: __main__.A[T2], t: T, t2: T2) -> T | T2"
16-
reveal_type(A[int]().f) # N: Revealed type is "def [T] (t: T, t2: int) -> T | int"
15+
reveal_type(A.f) # N: Revealed type is "def [T2 (from A): int, T: str] (self: __main__.A[T2], t: T, t2: T2) -> T | T2"
16+
reveal_type(A[int]().f) # N: Revealed type is "def [T: str] (t: T, t2: int) -> T | int"
1717
A.f = 1 # E: Cannot assign to a method [assignment] \
18-
# E: Incompatible types in assignment (expression has type "int", variable has type "[T2 (from A), T] (A[T2], T, T2) -> T | T2") [assignment]
18+
# E: Incompatible types in assignment (expression has type "int", variable has type "[T2 (from A): int, T: str] (A[T2], T, T2) -> T | T2") [assignment]
1919

2020

2121
[case testGenericFunction]
@@ -58,7 +58,7 @@ from typing import TypeVar
5858
T = TypeVar("T", bound=int)
5959

6060
def foo(t: T): ...
61-
reveal_type(foo) # N: Revealed type is "def [T: int] (t: T)"
61+
reveal_type(foo) # N: Revealed type is "def [T: int] (t: T) -> None"
6262

6363

6464
[case testInferredNever]
@@ -73,3 +73,9 @@ def b() -> NoReturn: ...
7373
reveal_type(a) # N: Revealed type is "Never"
7474
reveal_type(b) # N: Revealed type is "def () -> Never"
7575
b = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "() -> Never") [assignment]
76+
77+
78+
[case testRenderNoneReturn]
79+
def foo(): ...
80+
reveal_type(foo) # N: Revealed type is "def () -> None"
81+
foo = 1 # E: Incompatible types in assignment (expression has type "int", variable has type "() -> None") [assignment]

test-data/unit/check-based-untyped.test

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ def f1(a: List): ...
4747
def f2(a: List[Untyped]): ...
4848
a = [1]
4949
f1(a) # E: Call to incomplete function "f1" in typed context [no-untyped-call] \
50-
# N: Type is "def (a: list[Untyped])"
50+
# N: Type is "def (a: list[Untyped]) -> None"
5151
f2(a) # E: Call to incomplete function "f2" in typed context [no-untyped-call] \
52-
# N: Type is "def (a: list[Untyped])"
52+
# N: Type is "def (a: list[Untyped]) -> None"
5353

5454

5555
[case testIncompleteCall]

0 commit comments

Comments
 (0)