FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

gh-112331: Fix reference manual description of attribute lookup mechanics by rhettinger · Pull Request #112375 · python/cpython · GitHub

Repository navigation

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension .rst  (1) All 1 file type selected
Viewed files
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Unified
Split
Hide whitespace
Diff view
Unified
Split
Hide whitespace
18 changes: 12 additions & 6 deletions Doc/reference/expressions.rst
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -823,12 +823,18 @@ An attribute reference is a primary followed by a period and a name:

The primary must evaluate to an object of a type that supports attribute
references, which most objects do. This object is then asked to produce the
attribute whose name is the identifier. This production can be customized by
overriding the :meth:`__getattr__` method. If this attribute is not available,
the exception :exc:`AttributeError` is raised. Otherwise, the type and value of
the object produced is determined by the object. Multiple evaluations of the
same attribute reference may yield different objects.

attribute whose name is the identifier. The type and value produced is
determined by the object. Multiple evaluations of the same attribute
reference may yield different objects.

This production can be customized by overriding the
:meth:`~object.__getattribute__` method or the :meth:`~object.__getattr__`

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality
Suggested change
:meth:`~object.__getattribute__` method or the :meth:`~object.__getattr__`
:meth:`~object.__getattribute__` method and/or the :meth:`~object.__getattr__`

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

I think "or" is fine. The "and/or" is correct but looks weird and doesn't read well.

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

I disagree that it looks weird, but won't insist

method. The :meth:`!__getattribute__` method is called first and either
returns a value or raises :exc:`AttributeError` if the attribute is not
available.
Comment on lines +832 to +834

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.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Of course, it is possible to create badly behaved objects that raise other exceptions from __getattribute__:

>>> class Foo:
...     def __getattribute__(self, attr):
...         if attr == 'foo':
...             raise TypeError('no')
...         return object.__getattribute__(self, attr)
...
>>> f = Foo()
>>> f.a = 1
>>> f.a
1
>>> f.b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    f.b
  File "<stdin>", line 5, in __getattribute__
    return object.__getattribute__(self, attr)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'Foo' object has no attribute 'b'
>>> f.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    f.foo
  File "<stdin>", line 4, in __getattribute__
    raise TypeError('no')
TypeError: no

Does that need to be mentioned here? Or is it too obscure?

rhettinger Nov 25, 2023 •
edited
Loading

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

No need. Any code can raise a weird error at any time but we don't need to mention that in the docs in the thousands of places where this could occur:

This wording corresponds to what the code actually does:

def getattr_hook(obj, name):
    "Emulate slot_tp_getattr_hook() in Objects/typeobject.c"
    try:
        return obj.__getattribute__(name)
    except AttributeError:
        if not hasattr(type(obj), '__getattr__'):
            raise
    return type(obj).__getattr__(obj, name)


If an :exc:`AttributeError` is raised and the object has a :meth:`!__getattr__`
method, that method is called as a fallback.

.. _subscriptions:

Expand Down

Back | FazBrowse Home | New Git URL