New submission from Karthikeyan Singaravelan <tir.kar...@gmail.com>:

Python 3 supports type annotations in functions but when there is a TypeError 
due to calling a function then only the arguments are given in the error 
message. If the function has type annotations then adding them to the error 
message will give better experience and context. This doesn't break any 
existing code without type annotations but improves errors for code that has 
type annotations giving a better error reporting experience.

Currently format_missing method one of the methods used to raise TypeError that 
returns the name of the required positional arguments. The function receives 
the code object and type annotations are present in the function object. Hence 
I have used the code_object->co_name to get the function object from globals. 
After getting the function object I go through the annotations if present to 
form an error message to be attached with the existing error message.

I have implemented it in my branch : 
https://github.com/tirkarthi/cpython/tree/error-message-annotations


# foo_signature.py

from typing import List, Dict, NoReturn

def get_profile_a(user_id: int, likes: Dict[str, int]) -> Dict[str, int]:
    return {'user_id': user_id, 'likes': len(likes.keys())}

if __name__ == "__main__":
    get_profile_a()

# Error message for functions without type hints patch

cpython git:(master) ✗ ./python foo_signature.py
Traceback (most recent call last):
  File "foo_signature.py", line 11, in <module>
    get_profile_a()
TypeError: get_profile_a() missing 2 required positional arguments: 'user_id' 
and 'likes'

# Error message for functions with type hints patch in my branch

cpython git:(error-message-annotations) ✗ ./python foo_signature.py
Traceback (most recent call last):
  File "foo_signature.py", line 11, in <module>
    get_profile_a()
TypeError: get_profile_a() missing 2 required positional arguments: 'user_id' 
and 'likes'
Annotation: (user_id: <class 'int'>, likes: typing.Dict[str, int], return: 
typing.Dict[str, int])


The proposed patch adds the annotations in the end thus giving more context to 
the user. 

Pros :

* Better error reporting and more context that helps beginners like Elm/Rust 
that have improved error messages.
* This will also motivate developers to write type annotations since error 
messages become more useful.

Cons : 

* Since code_object is present in the call site where TypeError is raised I 
need to do a lookup of the globals to get the function object. This can be 
fixed in the way get_type_hints works on a function object. This also blocks me 
from writing tests where the function is defined inside a class that inherits 
from unittest.TestCase.
* After getting the annotations I need to form a string with the relevant 
parameters. Since most of them are hash lookups I don't think there is a cost 
involved here. Most of the time TypeError is raised to the user. My C skills 
are also low and I hope code can be improved much better here.

I am good with the core team rejecting this patch but just wanted to put 
forward the idea. I have also created a thread in python-ideas mailing list to 
gather feedback about this and hope it gains some traction. I received good 
feedback from Ethan Smith, mypy core developer on Reddit : 
https://www.reddit.com/r/Python/comments/92eh1g/type_annotations_in_error_messages_for_better/e3655z1/

python-ideas thread : 
https://mail.python.org/pipermail/python-ideas/2018-July/052463.html

I am adding Raymond and Terry since the previous PRs I have raised regarding 
error messages were reviewed by them. Also from the past discussions they make 
decisions on whether the change and it's effect is worth enough to be added to 
the core given the implementation complexity. Feel free to un-assign yourself 
if this is irrelevant.


Thanks

----------
components: Interpreter Core
messages: 322527
nosy: rhettinger, terry.reedy, xtreak
priority: normal
severity: normal
status: open
title: Include type annotations in error messages for better errors
type: enhancement
versions: Python 3.8

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue34254>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to