2021-12-27 08:29:09 +00:00
|
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
|
2021-05-05 08:24:53 +00:00
|
|
|
import attr
|
2022-11-30 15:04:57 +00:00
|
|
|
import attrs
|
2021-05-05 08:24:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
@attr.define()
|
|
|
|
class Define:
|
|
|
|
a: str
|
|
|
|
b: int
|
|
|
|
|
|
|
|
|
|
|
|
reveal_type(Define.__init__) # noqa
|
|
|
|
|
|
|
|
|
|
|
|
@attr.define()
|
|
|
|
class DefineConverter:
|
|
|
|
# mypy plugin adapts the "int" method signature, pyright does not
|
|
|
|
with_converter: int = attr.field(converter=int)
|
|
|
|
|
|
|
|
|
|
|
|
reveal_type(DefineConverter.__init__) # noqa
|
|
|
|
|
|
|
|
|
|
|
|
# mypy plugin supports attr.frozen, pyright does not
|
|
|
|
@attr.frozen()
|
|
|
|
class Frozen:
|
|
|
|
a: str
|
|
|
|
|
|
|
|
|
|
|
|
d = Frozen("a")
|
|
|
|
d.a = "new"
|
|
|
|
|
|
|
|
reveal_type(d.a) # noqa
|
|
|
|
|
|
|
|
|
|
|
|
# but pyright supports attr.define(frozen)
|
|
|
|
@attr.define(frozen=True)
|
|
|
|
class FrozenDefine:
|
|
|
|
a: str
|
|
|
|
|
|
|
|
|
|
|
|
d2 = FrozenDefine("a")
|
|
|
|
d2.a = "new"
|
|
|
|
|
|
|
|
reveal_type(d2.a) # noqa
|
2022-11-30 15:04:57 +00:00
|
|
|
|
|
|
|
|
|
|
|
# Field-aliasing works
|
|
|
|
@attrs.define
|
|
|
|
class AliasedField:
|
|
|
|
_a: int = attrs.field(alias="_a")
|
|
|
|
|
|
|
|
|
|
|
|
af = AliasedField(42)
|
|
|
|
|
|
|
|
reveal_type(af.__init__) # noqa
|