Description
If I use a descriptor as at the end of this description, there are two problems with how the generated documentation for Example.count
looks like:
- There's no type information. It would be possible to get that from the
__get__
method. - The descriptor gets labels
class-atribute
andinstance-atribute
which are both somewhat wrong. Technically it is a class attribute, but so are methods andproperty
s (that are also implemented as descriptors) and they don't get such a label either. Technically it's not an instance attribute, but from the usage perspective it acts like one. I believe a proper label would bedata-descriptor
, butproperty
would probably be more familiar for normal users and the functionality is the same.
You can see how the example is rendered here in a demo site that I've used for MkDocs experiments.
A variation of this is using a descriptor as a method decorator like the setter we use extensively with the Robot Framework project to avoid using normal propertys with dummy getters. Such attributes are currently shown as methods without any type information. You can see an example here in a site where we are creating our new Manual that will also incorporate API docs.
from typing import overload, Self
class PositiveInteger[T]:
def __set_name__(self, owner: T, name: str):
self.name = '_' + name
@overload
def __get__(self, instance: None, owner: type[T]) -> Self:
...
@overload
def __get__(self, instance: T, owner: type[T]) -> int:
...
def __get__(self, instance, owner) -> int | Self:
if instance is None:
return self
return getattr(instance, self.name)
def __set__(self, instance: T, value: int):
if value <= 0:
raise ValueError(f'{value} is not positive')
setattr(instance, self.name, value)
class Example:
"""Example using descriptor."""
count = PositiveInteger()
"""Count as a positive integer."""
def __init__(self, count: int = 1):
self.count = count
I'm not sure should this have been submitted to griffe instead or should I have submitted separate issues about different problems. Feel free to move or split as needed.
Boost priority
- Boost priority in our backlog through Polar.sh. Higher pledge, higher priority.
- Minimum pledge by user/organization is $5, minimum amount for boost is $30.
- View all issues with pledges.
- We receive the funds once the issue is completed and confirmed by you.
- Features with the insiders label are released to sponsors first, and tied to a funding goal.