python-attrs / attrs

Python Classes Without Boilerplate
https://www.attrs.org/
MIT License
5.31k stars 374 forks source link

Pylance doesn't recognise attributes obtained from `fields` #1361

Open my1e5 opened 1 month ago

my1e5 commented 1 month ago

Consider this MRE

from attrs import define, fields

@define
class A:
    foo: int
    bar: float

f = fields(A)
print(f.foo)
Attribute(name='foo', default=NOTHING, validator=None, repr=True, eq=True, eq_key=None, order=True, order_key=None, hash=None, init=True, metadata=mappingproxy({}), type=<class 'int'>, converter=None, kw_only=False, inherited=False, on_setattr=None, alias='foo')

This all works fine.

The only thing that isn't working perfectly is Pylance doesn't seem to properly recognise this. It highlights the attribute in white and incorrect hover text is provided. Untitled

Looking at the types, I found

print(type(f))
<class 'AAttributes'>

But I couldn't find any reference to AAttributes in the codebase.

My question is, is there something that attrs needs to do to make Pylance work here? Or is this a bug/limitation with Pylance and I should open a ticket with them to get support for this?

Thanks.

hynek commented 2 weeks ago

attrs creates on-demand classes for attributes for each class:

https://github.com/python-attrs/attrs/blob/13e9a6aaeac156bf792878eceaba10321728fa36/src/attr/_make.py#L246-L270

Unfortunately, Pyright is not keen on implementing non-PEP features.