Issue #25590: Complete attribute names even if they are not yet created

This commit is contained in:
Martin Panter 2015-11-13 23:54:02 +00:00
parent f4ad5f5dea
commit 6fe39266c8
4 changed files with 21 additions and 3 deletions

View file

@ -120,6 +120,10 @@ Private and special attribute names now are omitted unless the prefix starts
with underscores. A space or a colon can be added after completed keyword. with underscores. A space or a colon can be added after completed keyword.
(Contributed by Serhiy Storchaka in :issue:`25011` and :issue:`25209`.) (Contributed by Serhiy Storchaka in :issue:`25011` and :issue:`25209`.)
Names of most attributes listed by :func:`dir` are now completed.
Previously, names of properties and slots which were not yet created on
an instance were excluded. (Contributed by Martin Panter in :issue:`25590`.)
urllib.robotparser urllib.robotparser
------------------ ------------------

View file

@ -160,12 +160,14 @@ class Completer:
for word in words: for word in words:
if (word[:n] == attr and if (word[:n] == attr and
not (noprefix and word[:n+1] == noprefix)): not (noprefix and word[:n+1] == noprefix)):
match = "%s.%s" % (expr, word)
try: try:
val = getattr(thisobject, word) val = getattr(thisobject, word)
except Exception: except Exception:
continue # Exclude properties that are not set pass # Include even if attribute not set
word = self._callable_postfix(val, "%s.%s" % (expr, word)) else:
matches.append(word) match = self._callable_postfix(val, match)
matches.append(match)
if matches or not noprefix: if matches or not noprefix:
break break
if noprefix == '_': if noprefix == '_':

View file

@ -92,6 +92,14 @@ class TestRlcompleter(unittest.TestCase):
self.assertEqual(completer.complete('f.b', 0), 'f.bar') self.assertEqual(completer.complete('f.b', 0), 'f.bar')
self.assertEqual(f.calls, 1) self.assertEqual(f.calls, 1)
def test_uncreated_attr(self):
# Attributes like properties and slots should be completed even when
# they haven't been created on an instance
class Foo:
__slots__ = ("bar",)
completer = rlcompleter.Completer(dict(f=Foo()))
self.assertEqual(completer.complete('f.', 0), 'f.bar')
def test_complete(self): def test_complete(self):
completer = rlcompleter.Completer() completer = rlcompleter.Completer()
self.assertEqual(completer.complete('', 0), '\t') self.assertEqual(completer.complete('', 0), '\t')

View file

@ -85,6 +85,10 @@ Core and Builtins
Library Library
------- -------
- Issue #25590: In the Readline completer, only call getattr() once per
attribute. Also complete names of attributes such as properties and slots
which are listed by dir() but not yet created on an instance.
- Issue #25498: Fix a crash when garbage-collecting ctypes objects created - Issue #25498: Fix a crash when garbage-collecting ctypes objects created
by wrapping a memoryview. This was a regression made in 3.5a1. Based by wrapping a memoryview. This was a regression made in 3.5a1. Based
on patch by Eryksun. on patch by Eryksun.