Document how to handle class variables/constants in typed syntax (#1352)

* Document how to handle class variables/constants in typed syntax

This is mentioned very briefly in the API docs for `auto_attrib` but
it's not easy to find if you don't already know about `typing.ClassVar`.

* Fix typo

* 2 empty lines before headers

---------

Co-authored-by: Hynek Schlawack <hs@ox.cx>
This commit is contained in:
Geoffrey Thomas 2024-09-23 00:24:03 -04:00 committed by GitHub
parent a785e6b4ae
commit 2afd663bf4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 18 additions and 0 deletions

View File

@ -106,6 +106,24 @@ Your constructive feedback is welcome in both [attrs#795](https://github.com/pyt
Generally speaking, the decision on improving *attrs* support in Pyright is entirely Microsoft's prerogative and they unequivocally indicated that they'll only add support for features that go through the PEP process, though.
:::
## Class variables and constants
If you are adding type annotations to all of your code, you might wonder how to define a class variable (as opposed to an instance variable), because a value assigned at class scope becomes a default for that attribute.
The proper way to type such a class variable, though, is with {data}`typing.ClassVar`, which indicates that the variable should only be assigned in the class (or its subclasses) and not in instances of the class.
*attrs* will skip over members annotated with {data}`typing.ClassVar`, allowing you to write a type annotation without turning the member into an attribute.
Class variables are often used for constants, though they can also be used for mutable singleton data shared across all instances of the class.
```
@attrs.define
class PngHeader:
SIGNATURE: typing.ClassVar[bytes] = b'\x89PNG\r\n\x1a\n'
height: int
width: int
interlaced: int = 0
...
```
[Mypy]: http://mypy-lang.org
[Pyright]: https://github.com/microsoft/pyright
[*pytype*]: https://google.github.io/pytype/