-
-
Notifications
You must be signed in to change notification settings - Fork 409
Description
Hello, there's some food for thought. Imagine a class referencing itself.
@attr.s
class A:
a: 'A' = attr.ib()
This is the proper way of doing this as per mypy. In the case of attrs though:
>>> attr.fields(A).a
Attribute(name='a', default=NOTHING, validator=None, repr=True, cmp=True, hash=None, init=True, convert=None, metadata=mappingproxy({}), type='A')
The string just gets copied into the type attribute. A.__annotations__ has the same problem. Ideally the type would be the actual class object. Mypy deals with this by having more than one pass when parsing.
The first question to answer if whether we should deal with this here, in attrs, or let code making use of the type attribute deal with it. Maybe instead of expecting higher levels to deal with this, Python itself should handle it (although good luck waiting for this :). I think it's worth trying to deal with this problem in attrs, to make it easier for others.
Dealing with just a class referencing itself is very doable. Now imagine circular references.
@attr.s
class A:
b: 'B' = attr.ib()
@attr.s
class B:
a: A = attr.ib()
Not really sure what to do here.