gh-113978: Ignore warnings on text completion inside REPL by WolframAlph · Pull Request #113979 · python/cpython · GitHub
Skip to content

gh-113978: Ignore warnings on text completion inside REPL - #113979

Merged
ambv merged 1 commit into
python:mainfrom
WolframAlph:supress-completion-warnings
May 21, 2024
Merged

gh-113978: Ignore warnings on text completion inside REPL#113979
ambv merged 1 commit into
python:mainfrom
WolframAlph:supress-completion-warnings

Conversation

@WolframAlph

Copy link
Copy Markdown
Contributor

@sobolevn sobolevn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe instead we should do this?

» git patch
diff --git Lib/rlcompleter.py Lib/rlcompleter.py
index 206d6fb511c..62fd2c7fdec 100644
--- Lib/rlcompleter.py
+++ Lib/rlcompleter.py
@@ -176,8 +176,9 @@ def attr_matches(self, text):
                 if (word[:n] == attr and
                     not (noprefix and word[:n+1] == noprefix)):
                     match = "%s.%s" % (expr, word)
+                    import types
                     if isinstance(getattr(type(thisobject), word, None),
-                                  property):
+                                  (property, types.GetSetDescriptorType)):
                         # bpo-44752: thisobject.word is a method decorated by
                         # `@property`. What follows applies a postfix if
                         # thisobject.word is callable, but know we know that
                        

It also solves the issue:
Снимок экрана 2024-01-12 в 14 35 59

@WolframAlph

Copy link
Copy Markdown
Contributor Author

@sobolevn

Copy link
Copy Markdown
Member

My thoughs: properties should not evaluate when auto-complete works, so I think that adding an ignore just hides this problem.

So, we should really address the root of this problem: do not execute .co_lnotab property on code objects (and similar types as well).

@WolframAlph

WolframAlph commented Jan 12, 2024

Copy link
Copy Markdown
Contributor Author

properties should not evaluate when auto-complete works

I agree. But is this true only for built-in objects and their properties or user defined as well?
Consider following piece of code:

class D:
    def __get__(self, _, __):
        print("evaluated")

class C:
    prop = D()

trying to get suggestions for C. evaluates prop and prints the message.

@sobolevn

Copy link
Copy Markdown
Member

We can also try to replace getattr with inspect.getattr_static

@WolframAlph

Copy link
Copy Markdown
Contributor Author

Some things depend on being evaluated. Using inspect.getattr_static instead of getattr breaks tests.

def test_attr_matches(self):
# test with builtins namespace
self.assertEqual(self.stdcompleter.attr_matches('str.s'),
['str.{}('.format(x) for x in dir(str)
if x.startswith('s')])
self.assertEqual(self.stdcompleter.attr_matches('tuple.foospamegg'), [])
expected = sorted({'None.%s%s' % (x,
'()' if x == '__init_subclass__'
else '' if x == '__doc__'
else '(')
for x in dir(None)})
self.assertEqual(self.stdcompleter.attr_matches('None.'), expected)
self.assertEqual(self.stdcompleter.attr_matches('None._'), expected)
self.assertEqual(self.stdcompleter.attr_matches('None.__'), expected)
# test with a customized namespace
self.assertEqual(self.completer.attr_matches('CompleteMe.sp'),
['CompleteMe.spam'])
self.assertEqual(self.completer.attr_matches('Completeme.egg'), [])
self.assertEqual(self.completer.attr_matches('CompleteMe.'),
['CompleteMe.mro()', 'CompleteMe.spam'])
self.assertEqual(self.completer.attr_matches('CompleteMe._'),
['CompleteMe._ham'])
matches = self.completer.attr_matches('CompleteMe.__')
for x in matches:
self.assertTrue(x.startswith('CompleteMe.__'), x)
self.assertIn('CompleteMe.__name__', matches)
self.assertIn('CompleteMe.__new__(', matches)
with patch.object(CompleteMe, "me", CompleteMe, create=True):
self.assertEqual(self.completer.attr_matches('CompleteMe.me.me.sp'),
['CompleteMe.me.me.spam'])
self.assertEqual(self.completer.attr_matches('egg.s'),
['egg.{}('.format(x) for x in dir(str)
if x.startswith('s')])

Things like __init_subclass__, __class__, mro, etc...

@ambv
ambv merged commit e03dde5 into python:main May 21, 2024
@lysnikolaou lysnikolaou added topic-repl Related to the interactive shell needs backport to 3.13 bugs and security fixes labels May 22, 2024
@miss-islington-app

Copy link
Copy Markdown

Thanks @WolframAlph for the PR, and @ambv for merging it 🌮🎉.. I'm working now to backport this PR to: 3.13.
🐍🍒⛏🤖

miss-islington pushed a commit to miss-islington/cpython that referenced this pull request May 22, 2024
…onGH-113979)

(cherry picked from commit e03dde5)

Co-authored-by: Yan Yanchii <yyanchiy@gmail.com>
@bedevere-app

bedevere-app Bot commented May 22, 2024

Copy link
Copy Markdown

@bedevere-app bedevere-app Bot removed the needs backport to 3.13 bugs and security fixes label May 22, 2024
ambv pushed a commit that referenced this pull request May 22, 2024
…113979) (#119429)

(cherry picked from commit e03dde5)

Co-authored-by: Yan Yanchii <yyanchiy@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

topic-repl Related to the interactive shell

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants