Я экспериментировал со следующим кодом:
>>> f = object()
# It's obvious behavior:
>>> f.foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'foo'
# However, the next one is surprising me!
>>> getattr(f, 'foo')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'foo'
# And this one returns None as expected:
>>> getattr(f, 'foo', None)
Затем я нашел эту псевдо-подпись getattr()
в PyCharm IDE:
def getattr(object, name, default=None): # known special case of getattr
"""
getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
"""
pass
Мой вопрос заключается в том, как python различает эти два сценария внутреннего использования getattr()
(и, возможно, других функций)? И можно ли сделать что-то подобное полностью в коде на стороне клиента?