253 lines
7.5 KiB
Python
253 lines
7.5 KiB
Python
|
import sys
|
||
|
|
||
|
from typing import (
|
||
|
Any,
|
||
|
Callable,
|
||
|
Mapping,
|
||
|
Sequence,
|
||
|
overload,
|
||
|
TypeVar,
|
||
|
)
|
||
|
|
||
|
# Because we need to type our own stuff, we have to make everything from
|
||
|
# attr explicitly public too.
|
||
|
from attr import __author__ as __author__
|
||
|
from attr import __copyright__ as __copyright__
|
||
|
from attr import __description__ as __description__
|
||
|
from attr import __email__ as __email__
|
||
|
from attr import __license__ as __license__
|
||
|
from attr import __title__ as __title__
|
||
|
from attr import __url__ as __url__
|
||
|
from attr import __version__ as __version__
|
||
|
from attr import __version_info__ as __version_info__
|
||
|
from attr import assoc as assoc
|
||
|
from attr import Attribute as Attribute
|
||
|
from attr import AttrsInstance as AttrsInstance
|
||
|
from attr import cmp_using as cmp_using
|
||
|
from attr import converters as converters
|
||
|
from attr import Converter as Converter
|
||
|
from attr import evolve as evolve
|
||
|
from attr import exceptions as exceptions
|
||
|
from attr import Factory as Factory
|
||
|
from attr import fields as fields
|
||
|
from attr import fields_dict as fields_dict
|
||
|
from attr import filters as filters
|
||
|
from attr import has as has
|
||
|
from attr import make_class as make_class
|
||
|
from attr import NOTHING as NOTHING
|
||
|
from attr import resolve_types as resolve_types
|
||
|
from attr import setters as setters
|
||
|
from attr import validate as validate
|
||
|
from attr import validators as validators
|
||
|
from attr import attrib, asdict as asdict, astuple as astuple
|
||
|
|
||
|
if sys.version_info >= (3, 11):
|
||
|
from typing import dataclass_transform
|
||
|
else:
|
||
|
from typing_extensions import dataclass_transform
|
||
|
|
||
|
_T = TypeVar("_T")
|
||
|
_C = TypeVar("_C", bound=type)
|
||
|
|
||
|
_EqOrderType = bool | Callable[[Any], Any]
|
||
|
_ValidatorType = Callable[[Any, "Attribute[_T]", _T], Any]
|
||
|
_ConverterType = Callable[[Any], Any]
|
||
|
_ReprType = Callable[[Any], str]
|
||
|
_ReprArgType = bool | _ReprType
|
||
|
_OnSetAttrType = Callable[[Any, "Attribute[Any]", Any], Any]
|
||
|
_OnSetAttrArgType = _OnSetAttrType | list[_OnSetAttrType] | setters._NoOpType
|
||
|
_FieldTransformer = Callable[
|
||
|
[type, list["Attribute[Any]"]], list["Attribute[Any]"]
|
||
|
]
|
||
|
# FIXME: in reality, if multiple validators are passed they must be in a list
|
||
|
# or tuple, but those are invariant and so would prevent subtypes of
|
||
|
# _ValidatorType from working when passed in a list or tuple.
|
||
|
_ValidatorArgType = _ValidatorType[_T] | Sequence[_ValidatorType[_T]]
|
||
|
|
||
|
@overload
|
||
|
def field(
|
||
|
*,
|
||
|
default: None = ...,
|
||
|
validator: None = ...,
|
||
|
repr: _ReprArgType = ...,
|
||
|
hash: bool | None = ...,
|
||
|
init: bool = ...,
|
||
|
metadata: Mapping[Any, Any] | None = ...,
|
||
|
converter: None = ...,
|
||
|
factory: None = ...,
|
||
|
kw_only: bool = ...,
|
||
|
eq: bool | None = ...,
|
||
|
order: bool | None = ...,
|
||
|
on_setattr: _OnSetAttrArgType | None = ...,
|
||
|
alias: str | None = ...,
|
||
|
type: type | None = ...,
|
||
|
) -> Any: ...
|
||
|
|
||
|
# This form catches an explicit None or no default and infers the type from the
|
||
|
# other arguments.
|
||
|
@overload
|
||
|
def field(
|
||
|
*,
|
||
|
default: None = ...,
|
||
|
validator: _ValidatorArgType[_T] | None = ...,
|
||
|
repr: _ReprArgType = ...,
|
||
|
hash: bool | None = ...,
|
||
|
init: bool = ...,
|
||
|
metadata: Mapping[Any, Any] | None = ...,
|
||
|
converter: _ConverterType | Converter[Any, _T] | None = ...,
|
||
|
factory: Callable[[], _T] | None = ...,
|
||
|
kw_only: bool = ...,
|
||
|
eq: _EqOrderType | None = ...,
|
||
|
order: _EqOrderType | None = ...,
|
||
|
on_setattr: _OnSetAttrArgType | None = ...,
|
||
|
alias: str | None = ...,
|
||
|
type: type | None = ...,
|
||
|
) -> _T: ...
|
||
|
|
||
|
# This form catches an explicit default argument.
|
||
|
@overload
|
||
|
def field(
|
||
|
*,
|
||
|
default: _T,
|
||
|
validator: _ValidatorArgType[_T] | None = ...,
|
||
|
repr: _ReprArgType = ...,
|
||
|
hash: bool | None = ...,
|
||
|
init: bool = ...,
|
||
|
metadata: Mapping[Any, Any] | None = ...,
|
||
|
converter: _ConverterType | Converter[Any, _T] | None = ...,
|
||
|
factory: Callable[[], _T] | None = ...,
|
||
|
kw_only: bool = ...,
|
||
|
eq: _EqOrderType | None = ...,
|
||
|
order: _EqOrderType | None = ...,
|
||
|
on_setattr: _OnSetAttrArgType | None = ...,
|
||
|
alias: str | None = ...,
|
||
|
type: type | None = ...,
|
||
|
) -> _T: ...
|
||
|
|
||
|
# This form covers type=non-Type: e.g. forward references (str), Any
|
||
|
@overload
|
||
|
def field(
|
||
|
*,
|
||
|
default: _T | None = ...,
|
||
|
validator: _ValidatorArgType[_T] | None = ...,
|
||
|
repr: _ReprArgType = ...,
|
||
|
hash: bool | None = ...,
|
||
|
init: bool = ...,
|
||
|
metadata: Mapping[Any, Any] | None = ...,
|
||
|
converter: _ConverterType | Converter[Any, _T] | None = ...,
|
||
|
factory: Callable[[], _T] | None = ...,
|
||
|
kw_only: bool = ...,
|
||
|
eq: _EqOrderType | None = ...,
|
||
|
order: _EqOrderType | None = ...,
|
||
|
on_setattr: _OnSetAttrArgType | None = ...,
|
||
|
alias: str | None = ...,
|
||
|
type: type | None = ...,
|
||
|
) -> Any: ...
|
||
|
@overload
|
||
|
@dataclass_transform(field_specifiers=(attrib, field))
|
||
|
def define(
|
||
|
maybe_cls: _C,
|
||
|
*,
|
||
|
these: dict[str, Any] | None = ...,
|
||
|
repr: bool = ...,
|
||
|
unsafe_hash: bool | None = ...,
|
||
|
hash: bool | None = ...,
|
||
|
init: bool = ...,
|
||
|
slots: bool = ...,
|
||
|
frozen: bool = ...,
|
||
|
weakref_slot: bool = ...,
|
||
|
str: bool = ...,
|
||
|
auto_attribs: bool = ...,
|
||
|
kw_only: bool = ...,
|
||
|
cache_hash: bool = ...,
|
||
|
auto_exc: bool = ...,
|
||
|
eq: bool | None = ...,
|
||
|
order: bool | None = ...,
|
||
|
auto_detect: bool = ...,
|
||
|
getstate_setstate: bool | None = ...,
|
||
|
on_setattr: _OnSetAttrArgType | None = ...,
|
||
|
field_transformer: _FieldTransformer | None = ...,
|
||
|
match_args: bool = ...,
|
||
|
) -> _C: ...
|
||
|
@overload
|
||
|
@dataclass_transform(field_specifiers=(attrib, field))
|
||
|
def define(
|
||
|
maybe_cls: None = ...,
|
||
|
*,
|
||
|
these: dict[str, Any] | None = ...,
|
||
|
repr: bool = ...,
|
||
|
unsafe_hash: bool | None = ...,
|
||
|
hash: bool | None = ...,
|
||
|
init: bool = ...,
|
||
|
slots: bool = ...,
|
||
|
frozen: bool = ...,
|
||
|
weakref_slot: bool = ...,
|
||
|
str: bool = ...,
|
||
|
auto_attribs: bool = ...,
|
||
|
kw_only: bool = ...,
|
||
|
cache_hash: bool = ...,
|
||
|
auto_exc: bool = ...,
|
||
|
eq: bool | None = ...,
|
||
|
order: bool | None = ...,
|
||
|
auto_detect: bool = ...,
|
||
|
getstate_setstate: bool | None = ...,
|
||
|
on_setattr: _OnSetAttrArgType | None = ...,
|
||
|
field_transformer: _FieldTransformer | None = ...,
|
||
|
match_args: bool = ...,
|
||
|
) -> Callable[[_C], _C]: ...
|
||
|
|
||
|
mutable = define
|
||
|
|
||
|
@overload
|
||
|
@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field))
|
||
|
def frozen(
|
||
|
maybe_cls: _C,
|
||
|
*,
|
||
|
these: dict[str, Any] | None = ...,
|
||
|
repr: bool = ...,
|
||
|
unsafe_hash: bool | None = ...,
|
||
|
hash: bool | None = ...,
|
||
|
init: bool = ...,
|
||
|
slots: bool = ...,
|
||
|
frozen: bool = ...,
|
||
|
weakref_slot: bool = ...,
|
||
|
str: bool = ...,
|
||
|
auto_attribs: bool = ...,
|
||
|
kw_only: bool = ...,
|
||
|
cache_hash: bool = ...,
|
||
|
auto_exc: bool = ...,
|
||
|
eq: bool | None = ...,
|
||
|
order: bool | None = ...,
|
||
|
auto_detect: bool = ...,
|
||
|
getstate_setstate: bool | None = ...,
|
||
|
on_setattr: _OnSetAttrArgType | None = ...,
|
||
|
field_transformer: _FieldTransformer | None = ...,
|
||
|
match_args: bool = ...,
|
||
|
) -> _C: ...
|
||
|
@overload
|
||
|
@dataclass_transform(frozen_default=True, field_specifiers=(attrib, field))
|
||
|
def frozen(
|
||
|
maybe_cls: None = ...,
|
||
|
*,
|
||
|
these: dict[str, Any] | None = ...,
|
||
|
repr: bool = ...,
|
||
|
unsafe_hash: bool | None = ...,
|
||
|
hash: bool | None = ...,
|
||
|
init: bool = ...,
|
||
|
slots: bool = ...,
|
||
|
frozen: bool = ...,
|
||
|
weakref_slot: bool = ...,
|
||
|
str: bool = ...,
|
||
|
auto_attribs: bool = ...,
|
||
|
kw_only: bool = ...,
|
||
|
cache_hash: bool = ...,
|
||
|
auto_exc: bool = ...,
|
||
|
eq: bool | None = ...,
|
||
|
order: bool | None = ...,
|
||
|
auto_detect: bool = ...,
|
||
|
getstate_setstate: bool | None = ...,
|
||
|
on_setattr: _OnSetAttrArgType | None = ...,
|
||
|
field_transformer: _FieldTransformer | None = ...,
|
||
|
match_args: bool = ...,
|
||
|
) -> Callable[[_C], _C]: ...
|