New submission from Vanshaj Singhania <svanshaj2...@gmail.com>:

The documentation for the `str` class[^1] says:

> If neither encoding nor errors is given, str(object) returns object.__str__()

This led our students[^2] to try the following code:

    >>> class Test:
    ...     def __str__(self):
    ...         return 'hi'
    ... 
    >>> test = Test()
    >>> test.__str__ = lambda self: 'bye'
    >>> str(test)

The expected result was calling `test.__str__()`, but instead the interpreter 
output was `'hi'`.

The docs for special method lookup[^3] do say that instance attributes are 
ignored:

> For custom classes, implicit invocations of special methods are only 
> guaranteed to work correctly if defined on an object’s type, not in the 
> object’s instance dictionary.

This makes sense, and explains the observed behavior, but the `str` class docs 
seem to be inconsistent with this. Perhaps it would be more clear if the `str` 
documentation mentioned that it called `type(object).__str__()` instead of 
`object.__str__()`.

[^1]: https://docs.python.org/3/library/stdtypes.html#str
[^2]: CS 61A at UC Berkeley, https://cs61a.org
[^3]: https://docs.python.org/3/reference/datamodel.html#special-method-lookup

----------
assignee: docs@python
components: Documentation
messages: 415110
nosy: docs@python, itsvs
priority: normal
severity: normal
status: open
title: [doc] str docs are inconsistent with special method lookup
type: enhancement
versions: Python 3.10, Python 3.11, Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue47007>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to