[3.11] gh-114552: Update `__dir__` method docs: it allows returning an iterable (GH-114662) (#115235)

gh-114552: Update `__dir__` method docs: it allows returning an iterable (GH-114662)
(cherry picked from commit e19103a346)

Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
This commit is contained in:
Miss Islington (bot) 2024-02-10 09:54:43 +01:00 committed by GitHub
parent 115f72b70b
commit 089cae5158
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 3 deletions

View File

@ -1966,8 +1966,8 @@ access (use of, assignment to, or deletion of ``x.name``) for class instances.
.. method:: object.__dir__(self) .. method:: object.__dir__(self)
Called when :func:`dir` is called on the object. A sequence must be Called when :func:`dir` is called on the object. An iterable must be
returned. :func:`dir` converts the returned sequence to a list and sorts it. returned. :func:`dir` converts the returned iterable to a list and sorts it.
Customizing module attribute access Customizing module attribute access
@ -1987,7 +1987,7 @@ not found on a module object through the normal lookup, i.e.
the module ``__dict__`` before raising an :exc:`AttributeError`. If found, the module ``__dict__`` before raising an :exc:`AttributeError`. If found,
it is called with the attribute name and the result is returned. it is called with the attribute name and the result is returned.
The ``__dir__`` function should accept no arguments, and return a sequence of The ``__dir__`` function should accept no arguments, and return an iterable of
strings that represents the names accessible on module. If present, this strings that represents the names accessible on module. If present, this
function overrides the standard :func:`dir` search on a module. function overrides the standard :func:`dir` search on a module.

View File

@ -577,6 +577,14 @@ def __dir__(self):
self.assertIsInstance(res, list) self.assertIsInstance(res, list)
self.assertTrue(res == ["a", "b", "c"]) self.assertTrue(res == ["a", "b", "c"])
# dir(obj__dir__iterable)
class Foo(object):
def __dir__(self):
return {"b", "c", "a"}
res = dir(Foo())
self.assertIsInstance(res, list)
self.assertEqual(sorted(res), ["a", "b", "c"])
# dir(obj__dir__not_sequence) # dir(obj__dir__not_sequence)
class Foo(object): class Foo(object):
def __dir__(self): def __dir__(self):