Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Typo hint message for from-imports? #91058

Closed
Jean-Abou-Samra mannequin opened this issue Mar 2, 2022 · 10 comments
Closed

Typo hint message for from-imports? #91058

Jean-Abou-Samra mannequin opened this issue Mar 2, 2022 · 10 comments
Labels
3.11 only security fixes interpreter-core (Objects, Python, Grammar, and Parser dirs) pending The issue will be closed if no feedback is provided type-feature A feature request or enhancement

Comments

@Jean-Abou-Samra
Copy link
Mannequin

Jean-Abou-Samra mannequin commented Mar 2, 2022

BPO 46902
Nosy @aroberge, @pablogsal, @jean-abou-samra

Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

Show more details

GitHub fields:

assignee = None
closed_at = None
created_at = <Date 2022-03-02.20:42:20.452>
labels = ['interpreter-core', 'type-feature', '3.11']
title = 'Typo hint message for from-imports?'
updated_at = <Date 2022-03-03.01:54:35.713>
user = 'https://github.com/Jean-Abou-Samra'

bugs.python.org fields:

activity = <Date 2022-03-03.01:54:35.713>
actor = 'pablogsal'
assignee = 'none'
closed = False
closed_date = None
closer = None
components = ['Interpreter Core']
creation = <Date 2022-03-02.20:42:20.452>
creator = 'Jean_Abou_Samra'
dependencies = []
files = []
hgrepos = []
issue_num = 46902
keywords = []
message_count = 2.0
messages = ['414385', '414398']
nosy_count = 3.0
nosy_names = ['aroberge', 'pablogsal', 'Jean_Abou_Samra']
pr_nums = []
priority = 'normal'
resolution = None
stage = None
status = 'open'
superseder = None
type = 'enhancement'
url = 'https://bugs.python.org/issue46902'
versions = ['Python 3.11']

@Jean-Abou-Samra
Copy link
Mannequin Author

Jean-Abou-Samra mannequin commented Mar 2, 2022

See for example:

>>> from pygments.regexopt import regexopt
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'regexopt' from 'pygments.regexopt' (/home/jean/repos/pygments/pygments/regexopt.py)
>>> from pygments.regexopt import regex_opt
>>> regexopt
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'regexopt' is not defined. Did you mean: 'regex_opt'?

In Python 3.10, there is a nice helpful error message suggesting
how to correct the typo for NameError and AttributeError. Would
it be possible to have the same for ImportError with 'from import'?

@Jean-Abou-Samra Jean-Abou-Samra mannequin added 3.10 only security fixes 3.11 only security fixes interpreter-core (Objects, Python, Grammar, and Parser dirs) type-feature A feature request or enhancement labels Mar 2, 2022
@AlexWaygood AlexWaygood removed 3.10 only security fixes labels Mar 2, 2022
@pablogsal
Copy link
Member

I evaluated this, but is considerably more complex than the regular import, because one triggers an attribute error where we have the full module but in the second case we don't have the full module ready, so it requires considerable modifications.

I will investigate again if there is a way that doesn't require lots of changes, but is likely that we unfortunately need to reject this improvement :(

@ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
@erlend-aasland
Copy link
Contributor

Pablo's reply hints that the added complexity would not be worth it. I suggest to consider closing this as rejected, unless Pablo found a less complex way :)

@erlend-aasland erlend-aasland added the pending The issue will be closed if no feedback is provided label Aug 16, 2022
@aroberge
Copy link

Perhaps it is doable within CPython without too much added code since is something that friendly_traceback can do.

[1]: from pygments.regexopt import regexopt

Traceback (most recent call last):
  Code block [1], line 1
    from pygments.regexopt import regexopt
ImportError: cannot import name 'regexopt' from 'pygments.regexopt'
(C:\Users\Andre.Roberge\AppData\Local\Programs\Python\Python310\lib\site-packages\pygments\regexopt.py)

Did you mean regex_opt?

[2]: why()

Perhaps you meant to import regex_opt (from pygments.regexopt) instead of regexopt

[3] import sys;

[4] 'pygments' in sys.modules
True

@pablogsal
Copy link
Member

@aroberge You comment shows that friendly_traceback does it but unfortunately, it doesn't mention how you are proposing us to do it so we cannot evaluate the solution :( Could you add a brief sketch of how you are doing it in friendly_traceback?

@aroberge
Copy link

@pablogsal friendly_traceback looks at the list of modules found in sys.modules and, if the desired module is found, it proceeds from there.

The relevant code starts at:
https://github.com/friendly-traceback/friendly-traceback/blob/cdf87b1a623c4afcab4ad869eb29fe885e2d0621/friendly_traceback/runtime_errors/import_error.py#L104

Perhaps the way that the information available to friendly_traceback after an exception has been raised is not yet available to CPython at that point, but I thought I should mention this possibility.

@pablogsal
Copy link
Member

pablogsal commented Aug 18, 2022

@pablogsal friendly_traceback looks at the list of modules found in sys.modules and, if the desired module is found, it proceeds from there.

The relevant code starts at: friendly-traceback/friendly-traceback@cdf87b1/friendly_traceback/runtime_errors/import_error.py#L104

Perhaps the way that the information available to friendly_traceback after an exception has been raised is not yet available to CPython at that point, but I thought I should mention this possibility.

The problem with this approach is that if we do this every time the interpreter raises an ImportError we will slow down the interpreter when someone is catching said exception and continuing so they will have to pay an important (unbounded) cost for a message they won't see. That is what I am trying to circumvent. We cannot also install any exception hooks because of bootstrapping problems and because the interpreter needs to raise them without executing Python in some scenarios.

@aroberge
Copy link

Understood; most Python users (myself included) do appreciate this emphasis on speed. Those requiring better traceback analysis can use third-party packages, like friendly_traceback.

@erlend-aasland
Copy link
Contributor

Yeah, I think this approach is not very useful for CPython. A lot of stdlib modules try to import their C implementation first, else fall back to a Python implementation. I think we can safely close this.

@pablogsal
Copy link
Member

pablogsal commented Oct 15, 2022

The fairy of error messages is back! ✨

I found a way to implement this without penalty to control-flow failed imports that are quite clean IMHO:

#98305

Thanks @aroberge for suggesting the idea in the first place. Good things come to those who wait apparently :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.11 only security fixes interpreter-core (Objects, Python, Grammar, and Parser dirs) pending The issue will be closed if no feedback is provided type-feature A feature request or enhancement
Projects
None yet
Development

No branches or pull requests

4 participants