On Mon, Jan 11, 2021 at 5:21 PM Larry Hastings <larry@hastings.org> wrote:


On 1/11/21 4:39 PM, Guido van Rossum wrote:
The easiest thing would be just to create an empty `__annotations__` for classes that have no annotated variables, and to hell with the cost.

I assume you'd keep the existing behavior where functions lazy-create an empty dict if they have no annotations too?

Indeed -- that's trying to provide a uniform interface.

That all would work fine and be consistent, but you'd probably have to set the empty __annotations__ dict on modules too.  I've noticed that code that examines annotations tends to handle two classes of objects: "functions" and "not-functions".  Modules also store their __annotations__ in their __dict__, so the same code path works fine for examining the annotations of both classes and modules.


I'm not against giving all modules an empty `__annotations__` by default.


(I noticed that `__slots__` is missing from your list. Maybe because it follows yet another pattern?)

I forgot about __slots__!  Yup, it's optional, and you can even delete it, though after the class is defined I'm not sure how much difference that makes.

Slots intelligently support inheritance, too.  I always kind of wondered why annotations didn't support inheritance--if D is a subclass of C, why doesn't D.__annotations__ contain all C's annotations too?  But we're way past reconsidering that behavior now.


Anyway, `__slots__` doesn't behave that way -- seems it behaves similar to `__annotations__`.
```
Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec  7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class A: __slots__ = ['a']
...
>>> class B(A): __slots__ = ['b']
...
>>> B.__slots__
['b']
>>> class X(A): pass
...
>>> X.__slots__
['a']
>>> A().__dict__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute '__dict__'
>>> X().__dict__
{}
>>>
```

--
--Guido van Rossum (python.org/~guido)