This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Improving the error message when subclassing NewType
Type: enhancement Stage: resolved
Components: Library (Lib) Versions: Python 3.10
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: AlexWaygood, Gobot1234, JelleZijlstra, gvanrossum, kj, sobolevn
Priority: normal Keywords: patch

Created on 2021-12-24 00:01 by Gobot1234, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 30268 merged Gobot1234, 2021-12-26 14:29
Messages (9)
msg409114 - (view) Author: Gobot1234 (Gobot1234) * Date: 2021-12-24 00:01
I'd like to propose making the error message when subclassing typing.NewType much more understandable. Currently it looks like:
```
TypeError: NewType.__init__() takes 3 positional arguments but 4 were given
```
But I think we could do much better by adding __mro_entries__ to the class and then just having that raise a TypeError telling users they cannot subclass NewType and they are probably looking for `NewType('Subclass', OlderType)`. I'd be happy to patch this myself if this sounds like a good idea.
msg409181 - (view) Author: Nikita Sobolev (sobolevn) * (Python triager) Date: 2021-12-26 09:27
This seems like a good idea to me.

I will send a PR for others to judge :)
msg409184 - (view) Author: Nikita Sobolev (sobolevn) * (Python triager) Date: 2021-12-26 09:42
> I'd be happy to patch this myself if this sounds like a good idea.

Oh, please, go ahead! :)
Would be happy to review.
msg409203 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2021-12-26 16:15
Do you have evidence that people make this particular mistake often? And that the suggested solution is indeed what they should use? Why would you want to subclass UserId?

Do we have examples of other error messages split across two lines like this?
msg409209 - (view) Author: Gobot1234 (Gobot1234) * Date: 2021-12-26 16:28
> Do you have evidence that people make this particular mistake often? And that the suggested solution is indeed what they should use? Why would you want to subclass UserId?

I was just trying to implement something that I thought had a non-obvious error message and isn't necessarily initially obvious if you have the idea that NewType creates a new type/class. The documentation suggests this is what you should be doing instead of subclassing it
https://github.com/python/cpython/commit/342e800e974475cc302c46ed6d9f75276035278f#diff-8a0f115fde6769c122b771b6d0eca184c4580f7b5fabe2f0b0579c679424364fR101-R113

> Do we have examples of other error messages split across two lines like this?

No if you want me to remove it thats fine by me.
msg409213 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2021-12-26 17:16
Weird, the docs you cite claims


   # Also does not typecheck
   ProUserId = NewType('ProUserId', UserId)

but when I try it, it works at runtime and passes mypy (even with --strict) and also pyright.

So maybe those docs are incorrect? I can't find anything in PEP 484 about this.

In any case I'd drop the newline in the message -- other "Did you mean" errors don't have those.
msg409214 - (view) Author: Nikita Sobolev (sobolevn) * (Python triager) Date: 2021-12-26 17:29
> So maybe those docs are incorrect? I can't find anything in PEP 484 about this.

Mypy even has an explicit test that NewType of NewType should work: https://github.com/python/mypy/blob/f96446ce2f99a86210b21d39c7aec4b13a8bfc66/test-data/unit/check-newtype.test#L162-L165

I tend to agree with this behavior. This allows us to create complex type-safe DSLs:

```python
from typing import NewType

UserId = NewType('UserId', int)
ProUserId = NewType('ProUserId', UserId)

x: ProUserId = ProUserId(UserId(1))
```

Mypy is happy with that!

I will open a new issue about incorrect docs.
msg409215 - (view) Author: Nikita Sobolev (sobolevn) * (Python triager) Date: 2021-12-26 17:36
Turns out modern docs already have this problem fixed: https://docs.python.org/3/library/typing.html#newtype
msg414713 - (view) Author: Jelle Zijlstra (JelleZijlstra) * (Python committer) Date: 2022-03-08 03:50
New changeset f391f9bf28f0bba7939d9f9e5a7a6396d2b0df62 by James Hilton-Balfe in branch 'main':
bpo-46170: Improve the error message when subclassing NewType (GH-30268)
https://github.com/python/cpython/commit/f391f9bf28f0bba7939d9f9e5a7a6396d2b0df62
History
Date User Action Args
2022-04-11 14:59:53adminsetgithub: 90328
2022-03-08 03:51:06JelleZijlstrasetstatus: open -> closed
resolution: fixed
stage: patch review -> resolved
2022-03-08 03:50:51JelleZijlstrasetnosy: + JelleZijlstra
messages: + msg414713
2021-12-26 17:36:24sobolevnsetmessages: + msg409215
2021-12-26 17:29:27sobolevnsetmessages: + msg409214
2021-12-26 17:16:10gvanrossumsetmessages: + msg409213
2021-12-26 16:28:21Gobot1234setmessages: + msg409209
2021-12-26 16:15:04gvanrossumsetmessages: + msg409203
2021-12-26 14:29:37Gobot1234setkeywords: + patch
stage: patch review
pull_requests: + pull_request28485
2021-12-26 11:22:56AlexWaygoodsetnosy: + AlexWaygood
2021-12-26 09:42:47sobolevnsetmessages: + msg409184
2021-12-26 09:27:08sobolevnsetnosy: + sobolevn
messages: + msg409181
2021-12-24 00:01:32Gobot1234create