Mercurial > hg
annotate mercurial/thirdparty/attr/_make.py @ 52219:4496f059cf5c stable tip
wheel: enforce that translation being build for macos wheel
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Sun, 10 Nov 2024 00:46:44 +0100 |
parents | e1c586b9a43c |
children |
rev | line source |
---|---|
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1 # SPDX-License-Identifier: MIT |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
3 import copy |
34397 | 4 import linecache |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
5 import sys |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
6 import types |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
7 import typing |
34397 | 8 |
9 from operator import itemgetter | |
10 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
11 # We need to import _compat itself in addition to the _compat members to avoid |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
12 # having the thread-local in the globals here. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
13 from . import _compat, _config, setters |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
14 from ._compat import ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
15 HAS_F_STRINGS, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
16 PY310, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
17 PYPY, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
18 _AnnotationExtractor, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
19 ordered_dict, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
20 set_closure_cell, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
21 ) |
34397 | 22 from .exceptions import ( |
23 DefaultAlreadySetError, | |
24 FrozenInstanceError, | |
25 NotAnAttrsClassError, | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
26 UnannotatedAttributeError, |
34397 | 27 ) |
28 | |
29 | |
30 # This is used at least twice, so cache it here. | |
31 _obj_setattr = object.__setattr__ | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
32 _init_converter_pat = "__attr_converter_%s" |
34397 | 33 _init_factory_pat = "__attr_factory_{}" |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
34 _tuple_property_pat = ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
35 " {attr_name} = _attrs_property(_attrs_itemgetter({index}))" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
36 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
37 _classvar_prefixes = ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
38 "typing.ClassVar", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
39 "t.ClassVar", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
40 "ClassVar", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
41 "typing_extensions.ClassVar", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
42 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
43 # we don't use a double-underscore prefix because that triggers |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
44 # name mangling when trying to create a slot for the field |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
45 # (when slots=True) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
46 _hash_cache_field = "_attrs_cached_hash" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
47 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
48 _empty_metadata_singleton = types.MappingProxyType({}) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
49 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
50 # Unique object for unequivocal getattr() defaults. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
51 _sentinel = object() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
52 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
53 _ng_default_on_setattr = setters.pipe(setters.convert, setters.validate) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
54 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
55 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
56 class _Nothing: |
34397 | 57 """ |
58 Sentinel class to indicate the lack of a value when ``None`` is ambiguous. | |
59 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
60 ``_Nothing`` is a singleton. There is only ever one of it. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
61 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
62 .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False. |
34397 | 63 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
64 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
65 _singleton = None |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
66 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
67 def __new__(cls): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
68 if _Nothing._singleton is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
69 _Nothing._singleton = super().__new__(cls) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
70 return _Nothing._singleton |
34397 | 71 |
72 def __repr__(self): | |
73 return "NOTHING" | |
74 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
75 def __bool__(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
76 return False |
34397 | 77 |
78 | |
79 NOTHING = _Nothing() | |
80 """ | |
81 Sentinel to indicate the lack of a value when ``None`` is ambiguous. | |
82 """ | |
83 | |
84 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
85 class _CacheHashWrapper(int): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
86 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
87 An integer subclass that pickles / copies as None |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
88 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
89 This is used for non-slots classes with ``cache_hash=True``, to avoid |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
90 serializing a potentially (even likely) invalid hash value. Since ``None`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
91 is the default value for uncalculated hashes, whenever this is copied, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
92 the copy's value for the hash should automatically reset. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
93 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
94 See GH #613 for more details. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
95 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
96 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
97 def __reduce__(self, _none_constructor=type(None), _args=()): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
98 return _none_constructor, _args |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
99 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
100 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
101 def attrib( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
102 default=NOTHING, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
103 validator=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
104 repr=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
105 cmp=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
106 hash=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
107 init=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
108 metadata=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
109 type=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
110 converter=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
111 factory=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
112 kw_only=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
113 eq=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
114 order=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
115 on_setattr=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
116 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
117 """ |
34397 | 118 Create a new attribute on a class. |
119 | |
120 .. warning:: | |
121 | |
122 Does *not* do anything unless the class is also decorated with | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
123 `attr.s`! |
34397 | 124 |
125 :param default: A value that is used if an ``attrs``-generated ``__init__`` | |
126 is used and no value is passed while instantiating or the attribute is | |
127 excluded using ``init=False``. | |
128 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
129 If the value is an instance of `attrs.Factory`, its callable will be |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
130 used to construct a new value (useful for mutable data types like lists |
34397 | 131 or dicts). |
132 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
133 If a default is not set (or set manually to `attrs.NOTHING`), a value |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
134 *must* be supplied when instantiating; otherwise a `TypeError` |
34397 | 135 will be raised. |
136 | |
137 The default can also be set using decorator notation as shown below. | |
138 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
139 :type default: Any value |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
140 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
141 :param callable factory: Syntactic sugar for |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
142 ``default=attr.Factory(factory)``. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
143 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
144 :param validator: `callable` that is called by ``attrs``-generated |
34397 | 145 ``__init__`` methods after the instance has been initialized. They |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
146 receive the initialized instance, the :func:`~attrs.Attribute`, and the |
34397 | 147 passed value. |
148 | |
149 The return value is *not* inspected so the validator has to throw an | |
150 exception itself. | |
151 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
152 If a `list` is passed, its items are treated as validators and must |
34397 | 153 all pass. |
154 | |
155 Validators can be globally disabled and re-enabled using | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
156 `get_run_validators`. |
34397 | 157 |
158 The validator can also be set using decorator notation as shown below. | |
159 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
160 :type validator: `callable` or a `list` of `callable`\\ s. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
161 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
162 :param repr: Include this attribute in the generated ``__repr__`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
163 method. If ``True``, include the attribute; if ``False``, omit it. By |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
164 default, the built-in ``repr()`` function is used. To override how the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
165 attribute value is formatted, pass a ``callable`` that takes a single |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
166 value and returns a string. Note that the resulting string is used |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
167 as-is, i.e. it will be used directly *instead* of calling ``repr()`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
168 (the default). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
169 :type repr: a `bool` or a `callable` to use a custom function. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
170 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
171 :param eq: If ``True`` (default), include this attribute in the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
172 generated ``__eq__`` and ``__ne__`` methods that check two instances |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
173 for equality. To override how the attribute value is compared, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
174 pass a ``callable`` that takes a single value and returns the value |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
175 to be compared. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
176 :type eq: a `bool` or a `callable`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
177 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
178 :param order: If ``True`` (default), include this attributes in the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
179 generated ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
180 To override how the attribute value is ordered, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
181 pass a ``callable`` that takes a single value and returns the value |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
182 to be ordered. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
183 :type order: a `bool` or a `callable`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
184 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
185 :param cmp: Setting *cmp* is equivalent to setting *eq* and *order* to the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
186 same value. Must not be mixed with *eq* or *order*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
187 :type cmp: a `bool` or a `callable`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
188 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
189 :param Optional[bool] hash: Include this attribute in the generated |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
190 ``__hash__`` method. If ``None`` (default), mirror *eq*'s value. This |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
191 is the correct behavior according the Python spec. Setting this value |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
192 to anything else than ``None`` is *discouraged*. |
34397 | 193 :param bool init: Include this attribute in the generated ``__init__`` |
194 method. It is possible to set this to ``False`` and set a default | |
195 value. In that case this attributed is unconditionally initialized | |
196 with the specified default value or factory. | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
197 :param callable converter: `callable` that is called by |
34397 | 198 ``attrs``-generated ``__init__`` methods to convert attribute's value |
199 to the desired format. It is given the passed-in value, and the | |
200 returned value will be used as the new value of the attribute. The | |
201 value is converted before being passed to the validator, if any. | |
202 :param metadata: An arbitrary mapping, to be used by third-party | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
203 components. See `extending_metadata`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
204 :param type: The type of the attribute. In Python 3.6 or greater, the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
205 preferred method to specify the type is using a variable annotation |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
206 (see :pep:`526`). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
207 This argument is provided for backward compatibility. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
208 Regardless of the approach used, the type will be stored on |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
209 ``Attribute.type``. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
210 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
211 Please note that ``attrs`` doesn't do anything with this metadata by |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
212 itself. You can use it as part of your own code or for |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
213 `static type checking <types>`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
214 :param kw_only: Make this attribute keyword-only (Python 3+) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
215 in the generated ``__init__`` (if ``init`` is ``False``, this |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
216 parameter is ignored). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
217 :param on_setattr: Allows to overwrite the *on_setattr* setting from |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
218 `attr.s`. If left `None`, the *on_setattr* value from `attr.s` is used. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
219 Set to `attrs.setters.NO_OP` to run **no** `setattr` hooks for this |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
220 attribute -- regardless of the setting in `attr.s`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
221 :type on_setattr: `callable`, or a list of callables, or `None`, or |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
222 `attrs.setters.NO_OP` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
223 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
224 .. versionadded:: 15.2.0 *convert* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
225 .. versionadded:: 16.3.0 *metadata* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
226 .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
227 .. versionchanged:: 17.1.0 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
228 *hash* is ``None`` and therefore mirrors *eq* by default. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
229 .. versionadded:: 17.3.0 *type* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
230 .. deprecated:: 17.4.0 *convert* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
231 .. versionadded:: 17.4.0 *converter* as a replacement for the deprecated |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
232 *convert* to achieve consistency with other noun-based arguments. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
233 .. versionadded:: 18.1.0 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
234 ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
235 .. versionadded:: 18.2.0 *kw_only* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
236 .. versionchanged:: 19.2.0 *convert* keyword argument removed. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
237 .. versionchanged:: 19.2.0 *repr* also accepts a custom callable. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
238 .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
239 .. versionadded:: 19.2.0 *eq* and *order* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
240 .. versionadded:: 20.1.0 *on_setattr* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
241 .. versionchanged:: 20.3.0 *kw_only* backported to Python 2 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
242 .. versionchanged:: 21.1.0 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
243 *eq*, *order*, and *cmp* also accept a custom callable |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
244 .. versionchanged:: 21.1.0 *cmp* undeprecated |
34397 | 245 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
246 eq, eq_key, order, order_key = _determine_attrib_eq_order( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
247 cmp, eq, order, True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
248 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
249 |
34397 | 250 if hash is not None and hash is not True and hash is not False: |
251 raise TypeError( | |
252 "Invalid value for hash. Must be True, False, or None." | |
253 ) | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
254 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
255 if factory is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
256 if default is not NOTHING: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
257 raise ValueError( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
258 "The `default` and `factory` arguments are mutually " |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
259 "exclusive." |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
260 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
261 if not callable(factory): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
262 raise ValueError("The `factory` argument must be a callable.") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
263 default = Factory(factory) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
264 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
265 if metadata is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
266 metadata = {} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
267 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
268 # Apply syntactic sugar by auto-wrapping. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
269 if isinstance(on_setattr, (list, tuple)): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
270 on_setattr = setters.pipe(*on_setattr) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
271 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
272 if validator and isinstance(validator, (list, tuple)): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
273 validator = and_(*validator) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
274 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
275 if converter and isinstance(converter, (list, tuple)): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
276 converter = pipe(*converter) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
277 |
34397 | 278 return _CountingAttr( |
279 default=default, | |
280 validator=validator, | |
281 repr=repr, | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
282 cmp=None, |
34397 | 283 hash=hash, |
284 init=init, | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
285 converter=converter, |
34397 | 286 metadata=metadata, |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
287 type=type, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
288 kw_only=kw_only, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
289 eq=eq, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
290 eq_key=eq_key, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
291 order=order, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
292 order_key=order_key, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
293 on_setattr=on_setattr, |
34397 | 294 ) |
295 | |
296 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
297 def _compile_and_eval(script, globs, locs=None, filename=""): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
298 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
299 "Exec" the script with the given global (globs) and local (locs) variables. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
300 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
301 bytecode = compile(script, filename, "exec") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
302 eval(bytecode, globs, locs) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
303 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
304 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
305 def _make_method(name, script, filename, globs): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
306 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
307 Create the method with the script given and return the method object. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
308 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
309 locs = {} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
310 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
311 # In order of debuggers like PDB being able to step through the code, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
312 # we add a fake linecache entry. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
313 count = 1 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
314 base_filename = filename |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
315 while True: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
316 linecache_tuple = ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
317 len(script), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
318 None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
319 script.splitlines(True), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
320 filename, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
321 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
322 old_val = linecache.cache.setdefault(filename, linecache_tuple) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
323 if old_val == linecache_tuple: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
324 break |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
325 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
326 filename = "{}-{}>".format(base_filename[:-1], count) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
327 count += 1 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
328 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
329 _compile_and_eval(script, globs, locs, filename) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
330 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
331 return locs[name] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
332 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
333 |
34397 | 334 def _make_attr_tuple_class(cls_name, attr_names): |
335 """ | |
336 Create a tuple subclass to hold `Attribute`s for an `attrs` class. | |
337 | |
338 The subclass is a bare tuple with properties for names. | |
339 | |
340 class MyClassAttributes(tuple): | |
341 __slots__ = () | |
342 x = property(itemgetter(0)) | |
343 """ | |
344 attr_class_name = "{}Attributes".format(cls_name) | |
345 attr_class_template = [ | |
346 "class {}(tuple):".format(attr_class_name), | |
347 " __slots__ = ()", | |
348 ] | |
349 if attr_names: | |
350 for i, attr_name in enumerate(attr_names): | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
351 attr_class_template.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
352 _tuple_property_pat.format(index=i, attr_name=attr_name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
353 ) |
34397 | 354 else: |
355 attr_class_template.append(" pass") | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
356 globs = {"_attrs_itemgetter": itemgetter, "_attrs_property": property} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
357 _compile_and_eval("\n".join(attr_class_template), globs) |
34397 | 358 return globs[attr_class_name] |
359 | |
360 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
361 # Tuple class for extracted attributes from a class definition. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
362 # `base_attrs` is a subset of `attrs`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
363 _Attributes = _make_attr_tuple_class( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
364 "_Attributes", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
365 [ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
366 # all attributes to build dunder methods for |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
367 "attrs", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
368 # attributes that have been inherited |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
369 "base_attrs", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
370 # map inherited attributes to their originating classes |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
371 "base_attrs_map", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
372 ], |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
373 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
374 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
375 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
376 def _is_class_var(annot): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
377 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
378 Check whether *annot* is a typing.ClassVar. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
379 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
380 The string comparison hack is used to avoid evaluating all string |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
381 annotations which would put attrs-based classes at a performance |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
382 disadvantage compared to plain old classes. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
383 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
384 annot = str(annot) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
385 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
386 # Annotation can be quoted. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
387 if annot.startswith(("'", '"')) and annot.endswith(("'", '"')): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
388 annot = annot[1:-1] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
389 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
390 return annot.startswith(_classvar_prefixes) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
391 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
392 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
393 def _has_own_attribute(cls, attrib_name): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
394 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
395 Check whether *cls* defines *attrib_name* (and doesn't just inherit it). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
396 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
397 Requires Python 3. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
398 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
399 attr = getattr(cls, attrib_name, _sentinel) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
400 if attr is _sentinel: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
401 return False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
402 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
403 for base_cls in cls.__mro__[1:]: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
404 a = getattr(base_cls, attrib_name, None) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
405 if attr is a: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
406 return False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
407 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
408 return True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
409 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
410 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
411 def _get_annotations(cls): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
412 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
413 Get annotations for *cls*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
414 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
415 if _has_own_attribute(cls, "__annotations__"): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
416 return cls.__annotations__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
417 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
418 return {} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
419 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
420 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
421 def _counter_getter(e): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
422 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
423 Key function for sorting to avoid re-creating a lambda for every class. |
34397 | 424 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
425 return e[1].counter |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
426 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
427 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
428 def _collect_base_attrs(cls, taken_attr_names): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
429 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
430 Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
431 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
432 base_attrs = [] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
433 base_attr_map = {} # A dictionary of base attrs to their classes. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
434 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
435 # Traverse the MRO and collect attributes. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
436 for base_cls in reversed(cls.__mro__[1:-1]): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
437 for a in getattr(base_cls, "__attrs_attrs__", []): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
438 if a.inherited or a.name in taken_attr_names: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
439 continue |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
440 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
441 a = a.evolve(inherited=True) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
442 base_attrs.append(a) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
443 base_attr_map[a.name] = base_cls |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
444 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
445 # For each name, only keep the freshest definition i.e. the furthest at the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
446 # back. base_attr_map is fine because it gets overwritten with every new |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
447 # instance. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
448 filtered = [] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
449 seen = set() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
450 for a in reversed(base_attrs): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
451 if a.name in seen: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
452 continue |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
453 filtered.insert(0, a) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
454 seen.add(a.name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
455 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
456 return filtered, base_attr_map |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
457 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
458 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
459 def _collect_base_attrs_broken(cls, taken_attr_names): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
460 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
461 Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
462 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
463 N.B. *taken_attr_names* will be mutated. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
464 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
465 Adhere to the old incorrect behavior. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
466 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
467 Notably it collects from the front and considers inherited attributes which |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
468 leads to the buggy behavior reported in #428. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
469 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
470 base_attrs = [] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
471 base_attr_map = {} # A dictionary of base attrs to their classes. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
472 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
473 # Traverse the MRO and collect attributes. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
474 for base_cls in cls.__mro__[1:-1]: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
475 for a in getattr(base_cls, "__attrs_attrs__", []): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
476 if a.name in taken_attr_names: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
477 continue |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
478 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
479 a = a.evolve(inherited=True) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
480 taken_attr_names.add(a.name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
481 base_attrs.append(a) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
482 base_attr_map[a.name] = base_cls |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
483 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
484 return base_attrs, base_attr_map |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
485 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
486 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
487 def _transform_attrs( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
488 cls, these, auto_attribs, kw_only, collect_by_mro, field_transformer |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
489 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
490 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
491 Transform all `_CountingAttr`s on a class into `Attribute`s. |
34397 | 492 |
493 If *these* is passed, use that and don't look for them on the class. | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
494 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
495 *collect_by_mro* is True, collect them in the correct MRO order, otherwise |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
496 use the old -- incorrect -- order. See #428. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
497 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
498 Return an `_Attributes`. |
34397 | 499 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
500 cd = cls.__dict__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
501 anns = _get_annotations(cls) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
502 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
503 if these is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
504 ca_list = [(name, ca) for name, ca in these.items()] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
505 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
506 if not isinstance(these, ordered_dict): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
507 ca_list.sort(key=_counter_getter) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
508 elif auto_attribs is True: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
509 ca_names = { |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
510 name |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
511 for name, attr in cd.items() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
512 if isinstance(attr, _CountingAttr) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
513 } |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
514 ca_list = [] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
515 annot_names = set() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
516 for attr_name, type in anns.items(): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
517 if _is_class_var(type): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
518 continue |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
519 annot_names.add(attr_name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
520 a = cd.get(attr_name, NOTHING) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
521 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
522 if not isinstance(a, _CountingAttr): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
523 if a is NOTHING: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
524 a = attrib() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
525 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
526 a = attrib(default=a) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
527 ca_list.append((attr_name, a)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
528 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
529 unannotated = ca_names - annot_names |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
530 if len(unannotated) > 0: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
531 raise UnannotatedAttributeError( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
532 "The following `attr.ib`s lack a type annotation: " |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
533 + ", ".join( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
534 sorted(unannotated, key=lambda n: cd.get(n).counter) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
535 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
536 + "." |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
537 ) |
34397 | 538 else: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
539 ca_list = sorted( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
540 ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
541 (name, attr) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
542 for name, attr in cd.items() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
543 if isinstance(attr, _CountingAttr) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
544 ), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
545 key=lambda e: e[1].counter, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
546 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
547 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
548 own_attrs = [ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
549 Attribute.from_counting_attr( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
550 name=attr_name, ca=ca, type=anns.get(attr_name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
551 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
552 for attr_name, ca in ca_list |
34397 | 553 ] |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
554 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
555 if collect_by_mro: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
556 base_attrs, base_attr_map = _collect_base_attrs( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
557 cls, {a.name for a in own_attrs} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
558 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
559 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
560 base_attrs, base_attr_map = _collect_base_attrs_broken( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
561 cls, {a.name for a in own_attrs} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
562 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
563 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
564 if kw_only: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
565 own_attrs = [a.evolve(kw_only=True) for a in own_attrs] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
566 base_attrs = [a.evolve(kw_only=True) for a in base_attrs] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
567 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
568 attrs = base_attrs + own_attrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
569 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
570 # Mandatory vs non-mandatory attr order only matters when they are part of |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
571 # the __init__ signature and when they aren't kw_only (which are moved to |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
572 # the end and can be mandatory or non-mandatory in any order, as they will |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
573 # be specified as keyword args anyway). Check the order of those attrs: |
34397 | 574 had_default = False |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
575 for a in (a for a in attrs if a.init is not False and a.kw_only is False): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
576 if had_default is True and a.default is NOTHING: |
34397 | 577 raise ValueError( |
578 "No mandatory attributes allowed after an attribute with a " | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
579 "default value or factory. Attribute in question: %r" % (a,) |
34397 | 580 ) |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
581 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
582 if had_default is False and a.default is not NOTHING: |
34397 | 583 had_default = True |
584 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
585 if field_transformer is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
586 attrs = field_transformer(cls, attrs) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
587 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
588 # Create AttrsClass *after* applying the field_transformer since it may |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
589 # add or remove attributes! |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
590 attr_names = [a.name for a in attrs] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
591 AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
592 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
593 return _Attributes((AttrsClass(attrs), base_attrs, base_attr_map)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
594 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
595 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
596 if PYPY: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
597 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
598 def _frozen_setattrs(self, name, value): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
599 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
600 Attached to frozen classes as __setattr__. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
601 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
602 if isinstance(self, BaseException) and name in ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
603 "__cause__", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
604 "__context__", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
605 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
606 BaseException.__setattr__(self, name, value) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
607 return |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
608 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
609 raise FrozenInstanceError() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
610 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
611 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
612 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
613 def _frozen_setattrs(self, name, value): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
614 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
615 Attached to frozen classes as __setattr__. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
616 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
617 raise FrozenInstanceError() |
34397 | 618 |
619 | |
620 def _frozen_delattrs(self, name): | |
621 """ | |
622 Attached to frozen classes as __delattr__. | |
623 """ | |
624 raise FrozenInstanceError() | |
625 | |
626 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
627 class _ClassBuilder: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
628 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
629 Iteratively build *one* class. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
630 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
631 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
632 __slots__ = ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
633 "_attr_names", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
634 "_attrs", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
635 "_base_attr_map", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
636 "_base_names", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
637 "_cache_hash", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
638 "_cls", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
639 "_cls_dict", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
640 "_delete_attribs", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
641 "_frozen", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
642 "_has_pre_init", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
643 "_has_post_init", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
644 "_is_exc", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
645 "_on_setattr", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
646 "_slots", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
647 "_weakref_slot", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
648 "_wrote_own_setattr", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
649 "_has_custom_setattr", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
650 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
651 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
652 def __init__( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
653 self, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
654 cls, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
655 these, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
656 slots, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
657 frozen, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
658 weakref_slot, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
659 getstate_setstate, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
660 auto_attribs, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
661 kw_only, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
662 cache_hash, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
663 is_exc, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
664 collect_by_mro, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
665 on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
666 has_custom_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
667 field_transformer, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
668 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
669 attrs, base_attrs, base_map = _transform_attrs( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
670 cls, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
671 these, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
672 auto_attribs, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
673 kw_only, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
674 collect_by_mro, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
675 field_transformer, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
676 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
677 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
678 self._cls = cls |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
679 self._cls_dict = dict(cls.__dict__) if slots else {} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
680 self._attrs = attrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
681 self._base_names = {a.name for a in base_attrs} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
682 self._base_attr_map = base_map |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
683 self._attr_names = tuple(a.name for a in attrs) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
684 self._slots = slots |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
685 self._frozen = frozen |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
686 self._weakref_slot = weakref_slot |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
687 self._cache_hash = cache_hash |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
688 self._has_pre_init = bool(getattr(cls, "__attrs_pre_init__", False)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
689 self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
690 self._delete_attribs = not bool(these) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
691 self._is_exc = is_exc |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
692 self._on_setattr = on_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
693 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
694 self._has_custom_setattr = has_custom_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
695 self._wrote_own_setattr = False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
696 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
697 self._cls_dict["__attrs_attrs__"] = self._attrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
698 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
699 if frozen: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
700 self._cls_dict["__setattr__"] = _frozen_setattrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
701 self._cls_dict["__delattr__"] = _frozen_delattrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
702 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
703 self._wrote_own_setattr = True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
704 elif on_setattr in ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
705 _ng_default_on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
706 setters.validate, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
707 setters.convert, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
708 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
709 has_validator = has_converter = False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
710 for a in attrs: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
711 if a.validator is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
712 has_validator = True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
713 if a.converter is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
714 has_converter = True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
715 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
716 if has_validator and has_converter: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
717 break |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
718 if ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
719 ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
720 on_setattr == _ng_default_on_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
721 and not (has_validator or has_converter) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
722 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
723 or (on_setattr == setters.validate and not has_validator) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
724 or (on_setattr == setters.convert and not has_converter) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
725 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
726 # If class-level on_setattr is set to convert + validate, but |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
727 # there's no field to convert or validate, pretend like there's |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
728 # no on_setattr. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
729 self._on_setattr = None |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
730 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
731 if getstate_setstate: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
732 ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
733 self._cls_dict["__getstate__"], |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
734 self._cls_dict["__setstate__"], |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
735 ) = self._make_getstate_setstate() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
736 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
737 def __repr__(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
738 return "<_ClassBuilder(cls={cls})>".format(cls=self._cls.__name__) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
739 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
740 def build_class(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
741 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
742 Finalize class based on the accumulated configuration. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
743 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
744 Builder cannot be used after calling this method. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
745 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
746 if self._slots is True: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
747 return self._create_slots_class() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
748 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
749 return self._patch_original_class() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
750 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
751 def _patch_original_class(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
752 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
753 Apply accumulated methods and return the class. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
754 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
755 cls = self._cls |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
756 base_names = self._base_names |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
757 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
758 # Clean class of attribute definitions (`attr.ib()`s). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
759 if self._delete_attribs: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
760 for name in self._attr_names: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
761 if ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
762 name not in base_names |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
763 and getattr(cls, name, _sentinel) is not _sentinel |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
764 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
765 try: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
766 delattr(cls, name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
767 except AttributeError: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
768 # This can happen if a base class defines a class |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
769 # variable and we want to set an attribute with the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
770 # same name by using only a type annotation. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
771 pass |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
772 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
773 # Attach our dunder methods. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
774 for name, value in self._cls_dict.items(): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
775 setattr(cls, name, value) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
776 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
777 # If we've inherited an attrs __setattr__ and don't write our own, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
778 # reset it to object's. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
779 if not self._wrote_own_setattr and getattr( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
780 cls, "__attrs_own_setattr__", False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
781 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
782 cls.__attrs_own_setattr__ = False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
783 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
784 if not self._has_custom_setattr: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
785 cls.__setattr__ = _obj_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
786 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
787 return cls |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
788 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
789 def _create_slots_class(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
790 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
791 Build and return a new class with a `__slots__` attribute. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
792 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
793 cd = { |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
794 k: v |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
795 for k, v in self._cls_dict.items() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
796 if k not in tuple(self._attr_names) + ("__dict__", "__weakref__") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
797 } |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
798 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
799 # If our class doesn't have its own implementation of __setattr__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
800 # (either from the user or by us), check the bases, if one of them has |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
801 # an attrs-made __setattr__, that needs to be reset. We don't walk the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
802 # MRO because we only care about our immediate base classes. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
803 # XXX: This can be confused by subclassing a slotted attrs class with |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
804 # XXX: a non-attrs class and subclass the resulting class with an attrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
805 # XXX: class. See `test_slotted_confused` for details. For now that's |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
806 # XXX: OK with us. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
807 if not self._wrote_own_setattr: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
808 cd["__attrs_own_setattr__"] = False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
809 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
810 if not self._has_custom_setattr: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
811 for base_cls in self._cls.__bases__: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
812 if base_cls.__dict__.get("__attrs_own_setattr__", False): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
813 cd["__setattr__"] = _obj_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
814 break |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
815 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
816 # Traverse the MRO to collect existing slots |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
817 # and check for an existing __weakref__. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
818 existing_slots = dict() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
819 weakref_inherited = False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
820 for base_cls in self._cls.__mro__[1:-1]: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
821 if base_cls.__dict__.get("__weakref__", None) is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
822 weakref_inherited = True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
823 existing_slots.update( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
824 { |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
825 name: getattr(base_cls, name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
826 for name in getattr(base_cls, "__slots__", []) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
827 } |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
828 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
829 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
830 base_names = set(self._base_names) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
831 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
832 names = self._attr_names |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
833 if ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
834 self._weakref_slot |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
835 and "__weakref__" not in getattr(self._cls, "__slots__", ()) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
836 and "__weakref__" not in names |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
837 and not weakref_inherited |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
838 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
839 names += ("__weakref__",) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
840 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
841 # We only add the names of attributes that aren't inherited. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
842 # Setting __slots__ to inherited attributes wastes memory. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
843 slot_names = [name for name in names if name not in base_names] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
844 # There are slots for attributes from current class |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
845 # that are defined in parent classes. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
846 # As their descriptors may be overridden by a child class, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
847 # we collect them here and update the class dict |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
848 reused_slots = { |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
849 slot: slot_descriptor |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
850 for slot, slot_descriptor in existing_slots.items() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
851 if slot in slot_names |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
852 } |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
853 slot_names = [name for name in slot_names if name not in reused_slots] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
854 cd.update(reused_slots) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
855 if self._cache_hash: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
856 slot_names.append(_hash_cache_field) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
857 cd["__slots__"] = tuple(slot_names) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
858 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
859 cd["__qualname__"] = self._cls.__qualname__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
860 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
861 # Create new class based on old class and our methods. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
862 cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
863 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
864 # The following is a fix for |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
865 # <https://github.com/python-attrs/attrs/issues/102>. On Python 3, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
866 # if a method mentions `__class__` or uses the no-arg super(), the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
867 # compiler will bake a reference to the class in the method itself |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
868 # as `method.__closure__`. Since we replace the class with a |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
869 # clone, we rewrite these references so it keeps working. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
870 for item in cls.__dict__.values(): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
871 if isinstance(item, (classmethod, staticmethod)): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
872 # Class- and staticmethods hide their functions inside. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
873 # These might need to be rewritten as well. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
874 closure_cells = getattr(item.__func__, "__closure__", None) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
875 elif isinstance(item, property): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
876 # Workaround for property `super()` shortcut (PY3-only). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
877 # There is no universal way for other descriptors. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
878 closure_cells = getattr(item.fget, "__closure__", None) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
879 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
880 closure_cells = getattr(item, "__closure__", None) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
881 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
882 if not closure_cells: # Catch None or the empty list. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
883 continue |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
884 for cell in closure_cells: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
885 try: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
886 match = cell.cell_contents is self._cls |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
887 except ValueError: # ValueError: Cell is empty |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
888 pass |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
889 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
890 if match: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
891 set_closure_cell(cell, cls) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
892 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
893 return cls |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
894 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
895 def add_repr(self, ns): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
896 self._cls_dict["__repr__"] = self._add_method_dunders( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
897 _make_repr(self._attrs, ns, self._cls) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
898 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
899 return self |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
900 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
901 def add_str(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
902 repr = self._cls_dict.get("__repr__") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
903 if repr is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
904 raise ValueError( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
905 "__str__ can only be generated if a __repr__ exists." |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
906 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
907 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
908 def __str__(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
909 return self.__repr__() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
910 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
911 self._cls_dict["__str__"] = self._add_method_dunders(__str__) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
912 return self |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
913 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
914 def _make_getstate_setstate(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
915 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
916 Create custom __setstate__ and __getstate__ methods. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
917 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
918 # __weakref__ is not writable. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
919 state_attr_names = tuple( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
920 an for an in self._attr_names if an != "__weakref__" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
921 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
922 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
923 def slots_getstate(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
924 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
925 Automatically created by attrs. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
926 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
927 return tuple(getattr(self, name) for name in state_attr_names) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
928 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
929 hash_caching_enabled = self._cache_hash |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
930 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
931 def slots_setstate(self, state): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
932 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
933 Automatically created by attrs. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
934 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
935 __bound_setattr = _obj_setattr.__get__(self, Attribute) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
936 for name, value in zip(state_attr_names, state): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
937 __bound_setattr(name, value) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
938 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
939 # The hash code cache is not included when the object is |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
940 # serialized, but it still needs to be initialized to None to |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
941 # indicate that the first call to __hash__ should be a cache |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
942 # miss. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
943 if hash_caching_enabled: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
944 __bound_setattr(_hash_cache_field, None) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
945 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
946 return slots_getstate, slots_setstate |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
947 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
948 def make_unhashable(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
949 self._cls_dict["__hash__"] = None |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
950 return self |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
951 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
952 def add_hash(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
953 self._cls_dict["__hash__"] = self._add_method_dunders( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
954 _make_hash( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
955 self._cls, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
956 self._attrs, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
957 frozen=self._frozen, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
958 cache_hash=self._cache_hash, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
959 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
960 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
961 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
962 return self |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
963 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
964 def add_init(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
965 self._cls_dict["__init__"] = self._add_method_dunders( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
966 _make_init( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
967 self._cls, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
968 self._attrs, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
969 self._has_pre_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
970 self._has_post_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
971 self._frozen, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
972 self._slots, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
973 self._cache_hash, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
974 self._base_attr_map, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
975 self._is_exc, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
976 self._on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
977 attrs_init=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
978 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
979 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
980 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
981 return self |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
982 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
983 def add_match_args(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
984 self._cls_dict["__match_args__"] = tuple( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
985 field.name |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
986 for field in self._attrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
987 if field.init and not field.kw_only |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
988 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
989 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
990 def add_attrs_init(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
991 self._cls_dict["__attrs_init__"] = self._add_method_dunders( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
992 _make_init( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
993 self._cls, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
994 self._attrs, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
995 self._has_pre_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
996 self._has_post_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
997 self._frozen, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
998 self._slots, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
999 self._cache_hash, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1000 self._base_attr_map, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1001 self._is_exc, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1002 self._on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1003 attrs_init=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1004 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1005 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1006 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1007 return self |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1008 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1009 def add_eq(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1010 cd = self._cls_dict |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1011 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1012 cd["__eq__"] = self._add_method_dunders( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1013 _make_eq(self._cls, self._attrs) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1014 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1015 cd["__ne__"] = self._add_method_dunders(_make_ne()) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1016 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1017 return self |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1018 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1019 def add_order(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1020 cd = self._cls_dict |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1021 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1022 cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1023 self._add_method_dunders(meth) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1024 for meth in _make_order(self._cls, self._attrs) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1025 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1026 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1027 return self |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1028 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1029 def add_setattr(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1030 if self._frozen: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1031 return self |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1032 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1033 sa_attrs = {} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1034 for a in self._attrs: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1035 on_setattr = a.on_setattr or self._on_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1036 if on_setattr and on_setattr is not setters.NO_OP: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1037 sa_attrs[a.name] = a, on_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1038 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1039 if not sa_attrs: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1040 return self |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1041 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1042 if self._has_custom_setattr: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1043 # We need to write a __setattr__ but there already is one! |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1044 raise ValueError( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1045 "Can't combine custom __setattr__ with on_setattr hooks." |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1046 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1047 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1048 # docstring comes from _add_method_dunders |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1049 def __setattr__(self, name, val): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1050 try: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1051 a, hook = sa_attrs[name] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1052 except KeyError: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1053 nval = val |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1054 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1055 nval = hook(self, a, val) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1056 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1057 _obj_setattr(self, name, nval) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1058 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1059 self._cls_dict["__attrs_own_setattr__"] = True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1060 self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1061 self._wrote_own_setattr = True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1062 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1063 return self |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1064 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1065 def _add_method_dunders(self, method): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1066 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1067 Add __module__ and __qualname__ to a *method* if possible. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1068 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1069 try: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1070 method.__module__ = self._cls.__module__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1071 except AttributeError: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1072 pass |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1073 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1074 try: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1075 method.__qualname__ = ".".join( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1076 (self._cls.__qualname__, method.__name__) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1077 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1078 except AttributeError: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1079 pass |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1080 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1081 try: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1082 method.__doc__ = "Method generated by attrs for class %s." % ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1083 self._cls.__qualname__, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1084 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1085 except AttributeError: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1086 pass |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1087 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1088 return method |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1089 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1090 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1091 def _determine_attrs_eq_order(cmp, eq, order, default_eq): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1092 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1093 Validate the combination of *cmp*, *eq*, and *order*. Derive the effective |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1094 values of eq and order. If *eq* is None, set it to *default_eq*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1095 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1096 if cmp is not None and any((eq is not None, order is not None)): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1097 raise ValueError("Don't mix `cmp` with `eq' and `order`.") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1098 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1099 # cmp takes precedence due to bw-compatibility. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1100 if cmp is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1101 return cmp, cmp |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1102 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1103 # If left None, equality is set to the specified default and ordering |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1104 # mirrors equality. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1105 if eq is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1106 eq = default_eq |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1107 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1108 if order is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1109 order = eq |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1110 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1111 if eq is False and order is True: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1112 raise ValueError("`order` can only be True if `eq` is True too.") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1113 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1114 return eq, order |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1115 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1116 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1117 def _determine_attrib_eq_order(cmp, eq, order, default_eq): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1118 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1119 Validate the combination of *cmp*, *eq*, and *order*. Derive the effective |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1120 values of eq and order. If *eq* is None, set it to *default_eq*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1121 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1122 if cmp is not None and any((eq is not None, order is not None)): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1123 raise ValueError("Don't mix `cmp` with `eq' and `order`.") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1124 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1125 def decide_callable_or_boolean(value): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1126 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1127 Decide whether a key function is used. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1128 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1129 if callable(value): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1130 value, key = True, value |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1131 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1132 key = None |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1133 return value, key |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1134 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1135 # cmp takes precedence due to bw-compatibility. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1136 if cmp is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1137 cmp, cmp_key = decide_callable_or_boolean(cmp) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1138 return cmp, cmp_key, cmp, cmp_key |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1139 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1140 # If left None, equality is set to the specified default and ordering |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1141 # mirrors equality. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1142 if eq is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1143 eq, eq_key = default_eq, None |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1144 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1145 eq, eq_key = decide_callable_or_boolean(eq) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1146 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1147 if order is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1148 order, order_key = eq, eq_key |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1149 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1150 order, order_key = decide_callable_or_boolean(order) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1151 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1152 if eq is False and order is True: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1153 raise ValueError("`order` can only be True if `eq` is True too.") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1154 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1155 return eq, eq_key, order, order_key |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1156 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1157 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1158 def _determine_whether_to_implement( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1159 cls, flag, auto_detect, dunders, default=True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1160 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1161 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1162 Check whether we should implement a set of methods for *cls*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1163 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1164 *flag* is the argument passed into @attr.s like 'init', *auto_detect* the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1165 same as passed into @attr.s and *dunders* is a tuple of attribute names |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1166 whose presence signal that the user has implemented it themselves. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1167 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1168 Return *default* if no reason for either for or against is found. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1169 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1170 if flag is True or flag is False: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1171 return flag |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1172 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1173 if flag is None and auto_detect is False: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1174 return default |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1175 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1176 # Logically, flag is None and auto_detect is True here. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1177 for dunder in dunders: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1178 if _has_own_attribute(cls, dunder): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1179 return False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1180 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1181 return default |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1182 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1183 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1184 def attrs( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1185 maybe_cls=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1186 these=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1187 repr_ns=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1188 repr=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1189 cmp=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1190 hash=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1191 init=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1192 slots=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1193 frozen=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1194 weakref_slot=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1195 str=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1196 auto_attribs=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1197 kw_only=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1198 cache_hash=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1199 auto_exc=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1200 eq=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1201 order=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1202 auto_detect=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1203 collect_by_mro=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1204 getstate_setstate=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1205 on_setattr=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1206 field_transformer=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1207 match_args=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1208 ): |
34397 | 1209 r""" |
1210 A class decorator that adds `dunder | |
1211 <https://wiki.python.org/moin/DunderAlias>`_\ -methods according to the | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1212 specified attributes using `attr.ib` or the *these* argument. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1213 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1214 :param these: A dictionary of name to `attr.ib` mappings. This is |
34397 | 1215 useful to avoid the definition of your attributes within the class body |
1216 because you can't (e.g. if you want to add ``__repr__`` methods to | |
1217 Django models) or don't want to. | |
1218 | |
1219 If *these* is not ``None``, ``attrs`` will *not* search the class body | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1220 for attributes and will *not* remove any attributes from it. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1221 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1222 If *these* is an ordered dict (`dict` on Python 3.6+, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1223 `collections.OrderedDict` otherwise), the order is deduced from |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1224 the order of the attributes inside *these*. Otherwise the order |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1225 of the definition of the attributes is used. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1226 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1227 :type these: `dict` of `str` to `attr.ib` |
34397 | 1228 |
1229 :param str repr_ns: When using nested classes, there's no way in Python 2 | |
1230 to automatically detect that. Therefore it's possible to set the | |
1231 namespace explicitly for a more meaningful ``repr`` output. | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1232 :param bool auto_detect: Instead of setting the *init*, *repr*, *eq*, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1233 *order*, and *hash* arguments explicitly, assume they are set to |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1234 ``True`` **unless any** of the involved methods for one of the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1235 arguments is implemented in the *current* class (i.e. it is *not* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1236 inherited from some base class). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1237 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1238 So for example by implementing ``__eq__`` on a class yourself, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1239 ``attrs`` will deduce ``eq=False`` and will create *neither* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1240 ``__eq__`` *nor* ``__ne__`` (but Python classes come with a sensible |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1241 ``__ne__`` by default, so it *should* be enough to only implement |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1242 ``__eq__`` in most cases). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1243 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1244 .. warning:: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1245 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1246 If you prevent ``attrs`` from creating the ordering methods for you |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1247 (``order=False``, e.g. by implementing ``__le__``), it becomes |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1248 *your* responsibility to make sure its ordering is sound. The best |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1249 way is to use the `functools.total_ordering` decorator. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1250 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1251 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1252 Passing ``True`` or ``False`` to *init*, *repr*, *eq*, *order*, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1253 *cmp*, or *hash* overrides whatever *auto_detect* would determine. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1254 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1255 *auto_detect* requires Python 3. Setting it ``True`` on Python 2 raises |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1256 an `attrs.exceptions.PythonTooOldError`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1257 |
34397 | 1258 :param bool repr: Create a ``__repr__`` method with a human readable |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1259 representation of ``attrs`` attributes.. |
34397 | 1260 :param bool str: Create a ``__str__`` method that is identical to |
1261 ``__repr__``. This is usually not necessary except for | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1262 `Exception`\ s. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1263 :param Optional[bool] eq: If ``True`` or ``None`` (default), add ``__eq__`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1264 and ``__ne__`` methods that check two instances for equality. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1265 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1266 They compare the instances as if they were tuples of their ``attrs`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1267 attributes if and only if the types of both classes are *identical*! |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1268 :param Optional[bool] order: If ``True``, add ``__lt__``, ``__le__``, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1269 ``__gt__``, and ``__ge__`` methods that behave like *eq* above and |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1270 allow instances to be ordered. If ``None`` (default) mirror value of |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1271 *eq*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1272 :param Optional[bool] cmp: Setting *cmp* is equivalent to setting *eq* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1273 and *order* to the same value. Must not be mixed with *eq* or *order*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1274 :param Optional[bool] hash: If ``None`` (default), the ``__hash__`` method |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1275 is generated according how *eq* and *frozen* are set. |
34397 | 1276 |
1277 1. If *both* are True, ``attrs`` will generate a ``__hash__`` for you. | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1278 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set to |
34397 | 1279 None, marking it unhashable (which it is). |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1280 3. If *eq* is False, ``__hash__`` will be left untouched meaning the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1281 ``__hash__`` method of the base class will be used (if base class is |
34397 | 1282 ``object``, this means it will fall back to id-based hashing.). |
1283 | |
1284 Although not recommended, you can decide for yourself and force | |
1285 ``attrs`` to create one (e.g. if the class is immutable even though you | |
1286 didn't freeze it programmatically) by passing ``True`` or not. Both of | |
1287 these cases are rather special and should be used carefully. | |
1288 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1289 See our documentation on `hashing`, Python's documentation on |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1290 `object.__hash__`, and the `GitHub issue that led to the default \ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1291 behavior <https://github.com/python-attrs/attrs/issues/136>`_ for more |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1292 details. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1293 :param bool init: Create a ``__init__`` method that initializes the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1294 ``attrs`` attributes. Leading underscores are stripped for the argument |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1295 name. If a ``__attrs_pre_init__`` method exists on the class, it will |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1296 be called before the class is initialized. If a ``__attrs_post_init__`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1297 method exists on the class, it will be called after the class is fully |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1298 initialized. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1299 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1300 If ``init`` is ``False``, an ``__attrs_init__`` method will be |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1301 injected instead. This allows you to define a custom ``__init__`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1302 method that can do pre-init work such as ``super().__init__()``, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1303 and then call ``__attrs_init__()`` and ``__attrs_post_init__()``. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1304 :param bool slots: Create a `slotted class <slotted classes>` that's more |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1305 memory-efficient. Slotted classes are generally superior to the default |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1306 dict classes, but have some gotchas you should know about, so we |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1307 encourage you to read the `glossary entry <slotted classes>`. |
34397 | 1308 :param bool frozen: Make instances immutable after initialization. If |
1309 someone attempts to modify a frozen instance, | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1310 `attr.exceptions.FrozenInstanceError` is raised. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1311 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1312 .. note:: |
34397 | 1313 |
1314 1. This is achieved by installing a custom ``__setattr__`` method | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1315 on your class, so you can't implement your own. |
34397 | 1316 |
1317 2. True immutability is impossible in Python. | |
1318 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1319 3. This *does* have a minor a runtime performance `impact |
34397 | 1320 <how-frozen>` when initializing new instances. In other words: |
1321 ``__init__`` is slightly slower with ``frozen=True``. | |
1322 | |
1323 4. If a class is frozen, you cannot modify ``self`` in | |
1324 ``__attrs_post_init__`` or a self-written ``__init__``. You can | |
1325 circumvent that limitation by using | |
1326 ``object.__setattr__(self, "attribute_name", value)``. | |
1327 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1328 5. Subclasses of a frozen class are frozen too. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1329 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1330 :param bool weakref_slot: Make instances weak-referenceable. This has no |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1331 effect unless ``slots`` is also enabled. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1332 :param bool auto_attribs: If ``True``, collect :pep:`526`-annotated |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1333 attributes (Python 3.6 and later only) from the class body. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1334 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1335 In this case, you **must** annotate every field. If ``attrs`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1336 encounters a field that is set to an `attr.ib` but lacks a type |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1337 annotation, an `attr.exceptions.UnannotatedAttributeError` is |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1338 raised. Use ``field_name: typing.Any = attr.ib(...)`` if you don't |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1339 want to set a type. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1340 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1341 If you assign a value to those attributes (e.g. ``x: int = 42``), that |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1342 value becomes the default value like if it were passed using |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1343 ``attr.ib(default=42)``. Passing an instance of `attrs.Factory` also |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1344 works as expected in most cases (see warning below). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1345 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1346 Attributes annotated as `typing.ClassVar`, and attributes that are |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1347 neither annotated nor set to an `attr.ib` are **ignored**. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1348 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1349 .. warning:: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1350 For features that use the attribute name to create decorators (e.g. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1351 `validators <validators>`), you still *must* assign `attr.ib` to |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1352 them. Otherwise Python will either not find the name or try to use |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1353 the default value to call e.g. ``validator`` on it. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1354 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1355 These errors can be quite confusing and probably the most common bug |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1356 report on our bug tracker. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1357 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1358 :param bool kw_only: Make all attributes keyword-only (Python 3+) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1359 in the generated ``__init__`` (if ``init`` is ``False``, this |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1360 parameter is ignored). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1361 :param bool cache_hash: Ensure that the object's hash code is computed |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1362 only once and stored on the object. If this is set to ``True``, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1363 hashing must be either explicitly or implicitly enabled for this |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1364 class. If the hash code is cached, avoid any reassignments of |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1365 fields involved in hash code computation or mutations of the objects |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1366 those fields point to after object creation. If such changes occur, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1367 the behavior of the object's hash code is undefined. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1368 :param bool auto_exc: If the class subclasses `BaseException` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1369 (which implicitly includes any subclass of any exception), the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1370 following happens to behave like a well-behaved Python exceptions |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1371 class: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1372 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1373 - the values for *eq*, *order*, and *hash* are ignored and the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1374 instances compare and hash by the instance's ids (N.B. ``attrs`` will |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1375 *not* remove existing implementations of ``__hash__`` or the equality |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1376 methods. It just won't add own ones.), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1377 - all attributes that are either passed into ``__init__`` or have a |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1378 default value are additionally available as a tuple in the ``args`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1379 attribute, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1380 - the value of *str* is ignored leaving ``__str__`` to base classes. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1381 :param bool collect_by_mro: Setting this to `True` fixes the way ``attrs`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1382 collects attributes from base classes. The default behavior is |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1383 incorrect in certain cases of multiple inheritance. It should be on by |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1384 default but is kept off for backward-compatibility. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1385 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1386 See issue `#428 <https://github.com/python-attrs/attrs/issues/428>`_ for |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1387 more details. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1388 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1389 :param Optional[bool] getstate_setstate: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1390 .. note:: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1391 This is usually only interesting for slotted classes and you should |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1392 probably just set *auto_detect* to `True`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1393 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1394 If `True`, ``__getstate__`` and |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1395 ``__setstate__`` are generated and attached to the class. This is |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1396 necessary for slotted classes to be pickleable. If left `None`, it's |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1397 `True` by default for slotted classes and ``False`` for dict classes. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1398 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1399 If *auto_detect* is `True`, and *getstate_setstate* is left `None`, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1400 and **either** ``__getstate__`` or ``__setstate__`` is detected directly |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1401 on the class (i.e. not inherited), it is set to `False` (this is usually |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1402 what you want). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1403 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1404 :param on_setattr: A callable that is run whenever the user attempts to set |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1405 an attribute (either by assignment like ``i.x = 42`` or by using |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1406 `setattr` like ``setattr(i, "x", 42)``). It receives the same arguments |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1407 as validators: the instance, the attribute that is being modified, and |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1408 the new value. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1409 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1410 If no exception is raised, the attribute is set to the return value of |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1411 the callable. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1412 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1413 If a list of callables is passed, they're automatically wrapped in an |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1414 `attrs.setters.pipe`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1415 :type on_setattr: `callable`, or a list of callables, or `None`, or |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1416 `attrs.setters.NO_OP` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1417 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1418 :param Optional[callable] field_transformer: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1419 A function that is called with the original class object and all |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1420 fields right before ``attrs`` finalizes the class. You can use |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1421 this, e.g., to automatically add converters or validators to |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1422 fields based on their types. See `transform-fields` for more details. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1423 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1424 :param bool match_args: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1425 If `True` (default), set ``__match_args__`` on the class to support |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1426 :pep:`634` (Structural Pattern Matching). It is a tuple of all |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1427 non-keyword-only ``__init__`` parameter names on Python 3.10 and later. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1428 Ignored on older Python versions. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1429 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1430 .. versionadded:: 16.0.0 *slots* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1431 .. versionadded:: 16.1.0 *frozen* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1432 .. versionadded:: 16.3.0 *str* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1433 .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1434 .. versionchanged:: 17.1.0 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1435 *hash* supports ``None`` as value which is also the default now. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1436 .. versionadded:: 17.3.0 *auto_attribs* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1437 .. versionchanged:: 18.1.0 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1438 If *these* is passed, no attributes are deleted from the class body. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1439 .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1440 .. versionadded:: 18.2.0 *weakref_slot* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1441 .. deprecated:: 18.2.0 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1442 ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1443 `DeprecationWarning` if the classes compared are subclasses of |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1444 each other. ``__eq`` and ``__ne__`` never tried to compared subclasses |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1445 to each other. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1446 .. versionchanged:: 19.2.0 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1447 ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1448 subclasses comparable anymore. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1449 .. versionadded:: 18.2.0 *kw_only* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1450 .. versionadded:: 18.2.0 *cache_hash* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1451 .. versionadded:: 19.1.0 *auto_exc* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1452 .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1453 .. versionadded:: 19.2.0 *eq* and *order* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1454 .. versionadded:: 20.1.0 *auto_detect* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1455 .. versionadded:: 20.1.0 *collect_by_mro* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1456 .. versionadded:: 20.1.0 *getstate_setstate* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1457 .. versionadded:: 20.1.0 *on_setattr* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1458 .. versionadded:: 20.3.0 *field_transformer* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1459 .. versionchanged:: 21.1.0 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1460 ``init=False`` injects ``__attrs_init__`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1461 .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1462 .. versionchanged:: 21.1.0 *cmp* undeprecated |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1463 .. versionadded:: 21.3.0 *match_args* |
34397 | 1464 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1465 eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1466 hash_ = hash # work around the lack of nonlocal |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1467 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1468 if isinstance(on_setattr, (list, tuple)): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1469 on_setattr = setters.pipe(*on_setattr) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1470 |
34397 | 1471 def wrap(cls): |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1472 is_frozen = frozen or _has_frozen_base_class(cls) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1473 is_exc = auto_exc is True and issubclass(cls, BaseException) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1474 has_own_setattr = auto_detect and _has_own_attribute( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1475 cls, "__setattr__" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1476 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1477 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1478 if has_own_setattr and is_frozen: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1479 raise ValueError("Can't freeze a class with a custom __setattr__.") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1480 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1481 builder = _ClassBuilder( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1482 cls, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1483 these, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1484 slots, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1485 is_frozen, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1486 weakref_slot, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1487 _determine_whether_to_implement( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1488 cls, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1489 getstate_setstate, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1490 auto_detect, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1491 ("__getstate__", "__setstate__"), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1492 default=slots, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1493 ), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1494 auto_attribs, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1495 kw_only, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1496 cache_hash, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1497 is_exc, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1498 collect_by_mro, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1499 on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1500 has_own_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1501 field_transformer, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1502 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1503 if _determine_whether_to_implement( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1504 cls, repr, auto_detect, ("__repr__",) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1505 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1506 builder.add_repr(repr_ns) |
34397 | 1507 if str is True: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1508 builder.add_str() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1509 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1510 eq = _determine_whether_to_implement( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1511 cls, eq_, auto_detect, ("__eq__", "__ne__") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1512 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1513 if not is_exc and eq is True: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1514 builder.add_eq() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1515 if not is_exc and _determine_whether_to_implement( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1516 cls, order_, auto_detect, ("__lt__", "__le__", "__gt__", "__ge__") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1517 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1518 builder.add_order() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1519 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1520 builder.add_setattr() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1521 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1522 if ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1523 hash_ is None |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1524 and auto_detect is True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1525 and _has_own_attribute(cls, "__hash__") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1526 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1527 hash = False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1528 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1529 hash = hash_ |
34397 | 1530 if hash is not True and hash is not False and hash is not None: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1531 # Can't use `hash in` because 1 == True for example. |
34397 | 1532 raise TypeError( |
1533 "Invalid value for hash. Must be True, False, or None." | |
1534 ) | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1535 elif hash is False or (hash is None and eq is False) or is_exc: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1536 # Don't do anything. Should fall back to __object__'s __hash__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1537 # which is by id. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1538 if cache_hash: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1539 raise TypeError( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1540 "Invalid value for cache_hash. To use hash caching," |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1541 " hashing must be either explicitly or implicitly " |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1542 "enabled." |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1543 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1544 elif hash is True or ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1545 hash is None and eq is True and is_frozen is True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1546 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1547 # Build a __hash__ if told so, or if it's safe. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1548 builder.add_hash() |
34397 | 1549 else: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1550 # Raise TypeError on attempts to hash. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1551 if cache_hash: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1552 raise TypeError( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1553 "Invalid value for cache_hash. To use hash caching," |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1554 " hashing must be either explicitly or implicitly " |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1555 "enabled." |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1556 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1557 builder.make_unhashable() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1558 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1559 if _determine_whether_to_implement( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1560 cls, init, auto_detect, ("__init__",) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1561 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1562 builder.add_init() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1563 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1564 builder.add_attrs_init() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1565 if cache_hash: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1566 raise TypeError( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1567 "Invalid value for cache_hash. To use hash caching," |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1568 " init must be True." |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1569 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1570 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1571 if ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1572 PY310 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1573 and match_args |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1574 and not _has_own_attribute(cls, "__match_args__") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1575 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1576 builder.add_match_args() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1577 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1578 return builder.build_class() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1579 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1580 # maybe_cls's type depends on the usage of the decorator. It's a class |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1581 # if it's used as `@attrs` but ``None`` if used as `@attrs()`. |
34397 | 1582 if maybe_cls is None: |
1583 return wrap | |
1584 else: | |
1585 return wrap(maybe_cls) | |
1586 | |
1587 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1588 _attrs = attrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1589 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1590 Internal alias so we can use it in functions that take an argument called |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1591 *attrs*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1592 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1593 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1594 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1595 def _has_frozen_base_class(cls): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1596 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1597 Check whether *cls* has a frozen ancestor by looking at its |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1598 __setattr__. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1599 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1600 return cls.__setattr__ is _frozen_setattrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1601 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1602 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1603 def _generate_unique_filename(cls, func_name): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1604 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1605 Create a "filename" suitable for a function being generated. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1606 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1607 unique_filename = "<attrs generated {} {}.{}>".format( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1608 func_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1609 cls.__module__, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1610 getattr(cls, "__qualname__", cls.__name__), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1611 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1612 return unique_filename |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1613 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1614 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1615 def _make_hash(cls, attrs, frozen, cache_hash): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1616 attrs = tuple( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1617 a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1618 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1619 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1620 tab = " " |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1621 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1622 unique_filename = _generate_unique_filename(cls, "hash") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1623 type_hash = hash(unique_filename) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1624 # If eq is custom generated, we need to include the functions in globs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1625 globs = {} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1626 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1627 hash_def = "def __hash__(self" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1628 hash_func = "hash((" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1629 closing_braces = "))" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1630 if not cache_hash: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1631 hash_def += "):" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1632 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1633 hash_def += ", *" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1634 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1635 hash_def += ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1636 ", _cache_wrapper=" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1637 + "__import__('attr._make')._make._CacheHashWrapper):" |
34397 | 1638 ) |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1639 hash_func = "_cache_wrapper(" + hash_func |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1640 closing_braces += ")" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1641 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1642 method_lines = [hash_def] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1643 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1644 def append_hash_computation_lines(prefix, indent): |
34397 | 1645 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1646 Generate the code for actually computing the hash code. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1647 Below this will either be returned directly or used to compute |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1648 a value which is then cached, depending on the value of cache_hash |
34397 | 1649 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1650 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1651 method_lines.extend( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1652 [ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1653 indent + prefix + hash_func, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1654 indent + " %d," % (type_hash,), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1655 ] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1656 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1657 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1658 for a in attrs: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1659 if a.eq_key: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1660 cmp_name = "_%s_key" % (a.name,) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1661 globs[cmp_name] = a.eq_key |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1662 method_lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1663 indent + " %s(self.%s)," % (cmp_name, a.name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1664 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1665 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1666 method_lines.append(indent + " self.%s," % a.name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1667 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1668 method_lines.append(indent + " " + closing_braces) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1669 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1670 if cache_hash: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1671 method_lines.append(tab + "if self.%s is None:" % _hash_cache_field) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1672 if frozen: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1673 append_hash_computation_lines( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1674 "object.__setattr__(self, '%s', " % _hash_cache_field, tab * 2 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1675 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1676 method_lines.append(tab * 2 + ")") # close __setattr__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1677 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1678 append_hash_computation_lines( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1679 "self.%s = " % _hash_cache_field, tab * 2 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1680 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1681 method_lines.append(tab + "return self.%s" % _hash_cache_field) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1682 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1683 append_hash_computation_lines("return ", tab) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1684 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1685 script = "\n".join(method_lines) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1686 return _make_method("__hash__", script, unique_filename, globs) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1687 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1688 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1689 def _add_hash(cls, attrs): |
34397 | 1690 """ |
1691 Add a hash method to *cls*. | |
1692 """ | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1693 cls.__hash__ = _make_hash(cls, attrs, frozen=False, cache_hash=False) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1694 return cls |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1695 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1696 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1697 def _make_ne(): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1698 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1699 Create __ne__ method. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1700 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1701 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1702 def __ne__(self, other): |
34397 | 1703 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1704 Check equality and either forward a NotImplemented or |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1705 return the result negated. |
34397 | 1706 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1707 result = self.__eq__(other) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1708 if result is NotImplemented: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1709 return NotImplemented |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1710 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1711 return not result |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1712 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1713 return __ne__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1714 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1715 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1716 def _make_eq(cls, attrs): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1717 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1718 Create __eq__ method for *cls* with *attrs*. |
34397 | 1719 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1720 attrs = [a for a in attrs if a.eq] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1721 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1722 unique_filename = _generate_unique_filename(cls, "eq") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1723 lines = [ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1724 "def __eq__(self, other):", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1725 " if other.__class__ is not self.__class__:", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1726 " return NotImplemented", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1727 ] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1728 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1729 # We can't just do a big self.x = other.x and... clause due to |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1730 # irregularities like nan == nan is false but (nan,) == (nan,) is true. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1731 globs = {} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1732 if attrs: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1733 lines.append(" return (") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1734 others = [" ) == ("] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1735 for a in attrs: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1736 if a.eq_key: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1737 cmp_name = "_%s_key" % (a.name,) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1738 # Add the key function to the global namespace |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1739 # of the evaluated function. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1740 globs[cmp_name] = a.eq_key |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1741 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1742 " %s(self.%s)," |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1743 % ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1744 cmp_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1745 a.name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1746 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1747 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1748 others.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1749 " %s(other.%s)," |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1750 % ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1751 cmp_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1752 a.name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1753 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1754 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1755 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1756 lines.append(" self.%s," % (a.name,)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1757 others.append(" other.%s," % (a.name,)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1758 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1759 lines += others + [" )"] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1760 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1761 lines.append(" return True") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1762 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1763 script = "\n".join(lines) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1764 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1765 return _make_method("__eq__", script, unique_filename, globs) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1766 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1767 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1768 def _make_order(cls, attrs): |
34397 | 1769 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1770 Create ordering methods for *cls* with *attrs*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1771 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1772 attrs = [a for a in attrs if a.order] |
34397 | 1773 |
1774 def attrs_to_tuple(obj): | |
1775 """ | |
1776 Save us some typing. | |
1777 """ | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1778 return tuple( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1779 key(value) if key else value |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1780 for value, key in ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1781 (getattr(obj, a.name), a.order_key) for a in attrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1782 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1783 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1784 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1785 def __lt__(self, other): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1786 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1787 Automatically created by attrs. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1788 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1789 if other.__class__ is self.__class__: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1790 return attrs_to_tuple(self) < attrs_to_tuple(other) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1791 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1792 return NotImplemented |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1793 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1794 def __le__(self, other): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1795 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1796 Automatically created by attrs. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1797 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1798 if other.__class__ is self.__class__: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1799 return attrs_to_tuple(self) <= attrs_to_tuple(other) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1800 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1801 return NotImplemented |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1802 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1803 def __gt__(self, other): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1804 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1805 Automatically created by attrs. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1806 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1807 if other.__class__ is self.__class__: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1808 return attrs_to_tuple(self) > attrs_to_tuple(other) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1809 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1810 return NotImplemented |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1811 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1812 def __ge__(self, other): |
34397 | 1813 """ |
1814 Automatically created by attrs. | |
1815 """ | |
1816 if other.__class__ is self.__class__: | |
1817 return attrs_to_tuple(self) >= attrs_to_tuple(other) | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1818 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1819 return NotImplemented |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1820 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1821 return __lt__, __le__, __gt__, __ge__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1822 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1823 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1824 def _add_eq(cls, attrs=None): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1825 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1826 Add equality methods to *cls* with *attrs*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1827 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1828 if attrs is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1829 attrs = cls.__attrs_attrs__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1830 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1831 cls.__eq__ = _make_eq(cls, attrs) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1832 cls.__ne__ = _make_ne() |
34397 | 1833 |
1834 return cls | |
1835 | |
1836 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1837 if HAS_F_STRINGS: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1838 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1839 def _make_repr(attrs, ns, cls): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1840 unique_filename = _generate_unique_filename(cls, "repr") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1841 # Figure out which attributes to include, and which function to use to |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1842 # format them. The a.repr value can be either bool or a custom |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1843 # callable. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1844 attr_names_with_reprs = tuple( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1845 (a.name, (repr if a.repr is True else a.repr), a.init) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1846 for a in attrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1847 if a.repr is not False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1848 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1849 globs = { |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1850 name + "_repr": r |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1851 for name, r, _ in attr_names_with_reprs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1852 if r != repr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1853 } |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1854 globs["_compat"] = _compat |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1855 globs["AttributeError"] = AttributeError |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1856 globs["NOTHING"] = NOTHING |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1857 attribute_fragments = [] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1858 for name, r, i in attr_names_with_reprs: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1859 accessor = ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1860 "self." + name |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1861 if i |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1862 else 'getattr(self, "' + name + '", NOTHING)' |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1863 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1864 fragment = ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1865 "%s={%s!r}" % (name, accessor) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1866 if r == repr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1867 else "%s={%s_repr(%s)}" % (name, name, accessor) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1868 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1869 attribute_fragments.append(fragment) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1870 repr_fragment = ", ".join(attribute_fragments) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1871 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1872 if ns is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1873 cls_name_fragment = ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1874 '{self.__class__.__qualname__.rsplit(">.", 1)[-1]}' |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1875 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1876 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1877 cls_name_fragment = ns + ".{self.__class__.__name__}" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1878 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1879 lines = [ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1880 "def __repr__(self):", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1881 " try:", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1882 " already_repring = _compat.repr_context.already_repring", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1883 " except AttributeError:", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1884 " already_repring = {id(self),}", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1885 " _compat.repr_context.already_repring = already_repring", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1886 " else:", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1887 " if id(self) in already_repring:", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1888 " return '...'", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1889 " else:", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1890 " already_repring.add(id(self))", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1891 " try:", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1892 " return f'%s(%s)'" % (cls_name_fragment, repr_fragment), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1893 " finally:", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1894 " already_repring.remove(id(self))", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1895 ] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1896 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1897 return _make_method( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1898 "__repr__", "\n".join(lines), unique_filename, globs=globs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1899 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1900 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1901 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1902 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1903 def _make_repr(attrs, ns, _): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1904 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1905 Make a repr method that includes relevant *attrs*, adding *ns* to the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1906 full name. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1907 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1908 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1909 # Figure out which attributes to include, and which function to use to |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1910 # format them. The a.repr value can be either bool or a custom |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1911 # callable. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1912 attr_names_with_reprs = tuple( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1913 (a.name, repr if a.repr is True else a.repr) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1914 for a in attrs |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1915 if a.repr is not False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1916 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1917 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1918 def __repr__(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1919 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1920 Automatically created by attrs. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1921 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1922 try: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1923 already_repring = _compat.repr_context.already_repring |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1924 except AttributeError: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1925 already_repring = set() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1926 _compat.repr_context.already_repring = already_repring |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1927 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1928 if id(self) in already_repring: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1929 return "..." |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1930 real_cls = self.__class__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1931 if ns is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1932 class_name = real_cls.__qualname__.rsplit(">.", 1)[-1] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1933 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1934 class_name = ns + "." + real_cls.__name__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1935 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1936 # Since 'self' remains on the stack (i.e.: strongly referenced) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1937 # for the duration of this call, it's safe to depend on id(...) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1938 # stability, and not need to track the instance and therefore |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1939 # worry about properties like weakref- or hash-ability. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1940 already_repring.add(id(self)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1941 try: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1942 result = [class_name, "("] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1943 first = True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1944 for name, attr_repr in attr_names_with_reprs: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1945 if first: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1946 first = False |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1947 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1948 result.append(", ") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1949 result.extend( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1950 (name, "=", attr_repr(getattr(self, name, NOTHING))) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1951 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1952 return "".join(result) + ")" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1953 finally: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1954 already_repring.remove(id(self)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1955 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1956 return __repr__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1957 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1958 |
34397 | 1959 def _add_repr(cls, ns=None, attrs=None): |
1960 """ | |
1961 Add a repr method to *cls*. | |
1962 """ | |
1963 if attrs is None: | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1964 attrs = cls.__attrs_attrs__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1965 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1966 cls.__repr__ = _make_repr(attrs, ns, cls) |
34397 | 1967 return cls |
1968 | |
1969 | |
1970 def fields(cls): | |
1971 """ | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1972 Return the tuple of ``attrs`` attributes for a class. |
34397 | 1973 |
1974 The tuple also allows accessing the fields by their names (see below for | |
1975 examples). | |
1976 | |
1977 :param type cls: Class to introspect. | |
1978 | |
1979 :raise TypeError: If *cls* is not a class. | |
1980 :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` | |
1981 class. | |
1982 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1983 :rtype: tuple (with name accessors) of `attrs.Attribute` |
34397 | 1984 |
1985 .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields | |
1986 by name. | |
1987 """ | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1988 if not isinstance(cls, type): |
34397 | 1989 raise TypeError("Passed object must be a class.") |
1990 attrs = getattr(cls, "__attrs_attrs__", None) | |
1991 if attrs is None: | |
1992 raise NotAnAttrsClassError( | |
1993 "{cls!r} is not an attrs-decorated class.".format(cls=cls) | |
1994 ) | |
1995 return attrs | |
1996 | |
1997 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1998 def fields_dict(cls): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
1999 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2000 Return an ordered dictionary of ``attrs`` attributes for a class, whose |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2001 keys are the attribute names. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2002 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2003 :param type cls: Class to introspect. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2004 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2005 :raise TypeError: If *cls* is not a class. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2006 :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2007 class. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2008 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2009 :rtype: an ordered dict where keys are attribute names and values are |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2010 `attrs.Attribute`\\ s. This will be a `dict` if it's |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2011 naturally ordered like on Python 3.6+ or an |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2012 :class:`~collections.OrderedDict` otherwise. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2013 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2014 .. versionadded:: 18.1.0 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2015 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2016 if not isinstance(cls, type): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2017 raise TypeError("Passed object must be a class.") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2018 attrs = getattr(cls, "__attrs_attrs__", None) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2019 if attrs is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2020 raise NotAnAttrsClassError( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2021 "{cls!r} is not an attrs-decorated class.".format(cls=cls) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2022 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2023 return ordered_dict((a.name, a) for a in attrs) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2024 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2025 |
34397 | 2026 def validate(inst): |
2027 """ | |
2028 Validate all attributes on *inst* that have a validator. | |
2029 | |
2030 Leaves all exceptions through. | |
2031 | |
2032 :param inst: Instance of a class with ``attrs`` attributes. | |
2033 """ | |
2034 if _config._run_validators is False: | |
2035 return | |
2036 | |
2037 for a in fields(inst.__class__): | |
2038 v = a.validator | |
2039 if v is not None: | |
2040 v(inst, a, getattr(inst, a.name)) | |
2041 | |
2042 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2043 def _is_slot_cls(cls): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2044 return "__slots__" in cls.__dict__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2045 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2046 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2047 def _is_slot_attr(a_name, base_attr_map): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2048 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2049 Check if the attribute name comes from a slot class. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2050 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2051 return a_name in base_attr_map and _is_slot_cls(base_attr_map[a_name]) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2052 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2053 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2054 def _make_init( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2055 cls, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2056 attrs, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2057 pre_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2058 post_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2059 frozen, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2060 slots, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2061 cache_hash, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2062 base_attr_map, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2063 is_exc, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2064 cls_on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2065 attrs_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2066 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2067 has_cls_on_setattr = ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2068 cls_on_setattr is not None and cls_on_setattr is not setters.NO_OP |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2069 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2070 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2071 if frozen and has_cls_on_setattr: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2072 raise ValueError("Frozen classes can't use on_setattr.") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2073 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2074 needs_cached_setattr = cache_hash or frozen |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2075 filtered_attrs = [] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2076 attr_dict = {} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2077 for a in attrs: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2078 if not a.init and a.default is NOTHING: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2079 continue |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2080 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2081 filtered_attrs.append(a) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2082 attr_dict[a.name] = a |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2083 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2084 if a.on_setattr is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2085 if frozen is True: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2086 raise ValueError("Frozen classes can't use on_setattr.") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2087 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2088 needs_cached_setattr = True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2089 elif has_cls_on_setattr and a.on_setattr is not setters.NO_OP: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2090 needs_cached_setattr = True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2091 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2092 unique_filename = _generate_unique_filename(cls, "init") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2093 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2094 script, globs, annotations = _attrs_to_init_script( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2095 filtered_attrs, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2096 frozen, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2097 slots, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2098 pre_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2099 post_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2100 cache_hash, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2101 base_attr_map, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2102 is_exc, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2103 has_cls_on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2104 attrs_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2105 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2106 if cls.__module__ in sys.modules: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2107 # This makes typing.get_type_hints(CLS.__init__) resolve string types. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2108 globs.update(sys.modules[cls.__module__].__dict__) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2109 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2110 globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2111 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2112 if needs_cached_setattr: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2113 # Save the lookup overhead in __init__ if we need to circumvent |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2114 # setattr hooks. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2115 globs["_setattr"] = _obj_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2116 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2117 init = _make_method( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2118 "__attrs_init__" if attrs_init else "__init__", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2119 script, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2120 unique_filename, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2121 globs, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2122 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2123 init.__annotations__ = annotations |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2124 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2125 return init |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2126 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2127 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2128 def _setattr(attr_name, value_var, has_on_setattr): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2129 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2130 Use the cached object.setattr to set *attr_name* to *value_var*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2131 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2132 return "_setattr(self, '%s', %s)" % (attr_name, value_var) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2133 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2134 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2135 def _setattr_with_converter(attr_name, value_var, has_on_setattr): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2136 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2137 Use the cached object.setattr to set *attr_name* to *value_var*, but run |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2138 its converter first. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2139 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2140 return "_setattr(self, '%s', %s(%s))" % ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2141 attr_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2142 _init_converter_pat % (attr_name,), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2143 value_var, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2144 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2145 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2146 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2147 def _assign(attr_name, value, has_on_setattr): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2148 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2149 Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2150 relegate to _setattr. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2151 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2152 if has_on_setattr: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2153 return _setattr(attr_name, value, True) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2154 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2155 return "self.%s = %s" % (attr_name, value) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2156 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2157 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2158 def _assign_with_converter(attr_name, value_var, has_on_setattr): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2159 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2160 Unless *attr_name* has an on_setattr hook, use normal assignment after |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2161 conversion. Otherwise relegate to _setattr_with_converter. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2162 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2163 if has_on_setattr: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2164 return _setattr_with_converter(attr_name, value_var, True) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2165 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2166 return "self.%s = %s(%s)" % ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2167 attr_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2168 _init_converter_pat % (attr_name,), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2169 value_var, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2170 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2171 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2172 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2173 def _attrs_to_init_script( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2174 attrs, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2175 frozen, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2176 slots, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2177 pre_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2178 post_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2179 cache_hash, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2180 base_attr_map, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2181 is_exc, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2182 has_cls_on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2183 attrs_init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2184 ): |
34397 | 2185 """ |
2186 Return a script of an initializer for *attrs* and a dict of globals. | |
2187 | |
2188 The globals are expected by the generated script. | |
2189 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2190 If *frozen* is True, we cannot set the attributes directly so we use |
34397 | 2191 a cached ``object.__setattr__``. |
2192 """ | |
2193 lines = [] | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2194 if pre_init: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2195 lines.append("self.__attrs_pre_init__()") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2196 |
34397 | 2197 if frozen is True: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2198 if slots is True: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2199 fmt_setter = _setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2200 fmt_setter_with_converter = _setattr_with_converter |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2201 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2202 # Dict frozen classes assign directly to __dict__. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2203 # But only if the attribute doesn't come from an ancestor slot |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2204 # class. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2205 # Note _inst_dict will be used again below if cache_hash is True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2206 lines.append("_inst_dict = self.__dict__") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2207 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2208 def fmt_setter(attr_name, value_var, has_on_setattr): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2209 if _is_slot_attr(attr_name, base_attr_map): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2210 return _setattr(attr_name, value_var, has_on_setattr) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2211 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2212 return "_inst_dict['%s'] = %s" % (attr_name, value_var) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2213 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2214 def fmt_setter_with_converter( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2215 attr_name, value_var, has_on_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2216 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2217 if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2218 return _setattr_with_converter( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2219 attr_name, value_var, has_on_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2220 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2221 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2222 return "_inst_dict['%s'] = %s(%s)" % ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2223 attr_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2224 _init_converter_pat % (attr_name,), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2225 value_var, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2226 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2227 |
34397 | 2228 else: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2229 # Not frozen. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2230 fmt_setter = _assign |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2231 fmt_setter_with_converter = _assign_with_converter |
34397 | 2232 |
2233 args = [] | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2234 kw_only_args = [] |
34397 | 2235 attrs_to_validate = [] |
2236 | |
2237 # This is a dictionary of names to validator and converter callables. | |
2238 # Injecting this into __init__ globals lets us avoid lookups. | |
2239 names_for_globals = {} | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2240 annotations = {"return": None} |
34397 | 2241 |
2242 for a in attrs: | |
2243 if a.validator: | |
2244 attrs_to_validate.append(a) | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2245 |
34397 | 2246 attr_name = a.name |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2247 has_on_setattr = a.on_setattr is not None or ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2248 a.on_setattr is not setters.NO_OP and has_cls_on_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2249 ) |
34397 | 2250 arg_name = a.name.lstrip("_") |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2251 |
34397 | 2252 has_factory = isinstance(a.default, Factory) |
2253 if has_factory and a.default.takes_self: | |
2254 maybe_self = "self" | |
2255 else: | |
2256 maybe_self = "" | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2257 |
34397 | 2258 if a.init is False: |
2259 if has_factory: | |
2260 init_factory_name = _init_factory_pat.format(a.name) | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2261 if a.converter is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2262 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2263 fmt_setter_with_converter( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2264 attr_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2265 init_factory_name + "(%s)" % (maybe_self,), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2266 has_on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2267 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2268 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2269 conv_name = _init_converter_pat % (a.name,) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2270 names_for_globals[conv_name] = a.converter |
34397 | 2271 else: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2272 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2273 fmt_setter( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2274 attr_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2275 init_factory_name + "(%s)" % (maybe_self,), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2276 has_on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2277 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2278 ) |
34397 | 2279 names_for_globals[init_factory_name] = a.default.factory |
2280 else: | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2281 if a.converter is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2282 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2283 fmt_setter_with_converter( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2284 attr_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2285 "attr_dict['%s'].default" % (attr_name,), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2286 has_on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2287 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2288 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2289 conv_name = _init_converter_pat % (a.name,) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2290 names_for_globals[conv_name] = a.converter |
34397 | 2291 else: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2292 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2293 fmt_setter( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2294 attr_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2295 "attr_dict['%s'].default" % (attr_name,), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2296 has_on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2297 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2298 ) |
34397 | 2299 elif a.default is not NOTHING and not has_factory: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2300 arg = "%s=attr_dict['%s'].default" % (arg_name, attr_name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2301 if a.kw_only: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2302 kw_only_args.append(arg) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2303 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2304 args.append(arg) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2305 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2306 if a.converter is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2307 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2308 fmt_setter_with_converter( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2309 attr_name, arg_name, has_on_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2310 ) |
34397 | 2311 ) |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2312 names_for_globals[ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2313 _init_converter_pat % (a.name,) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2314 ] = a.converter |
34397 | 2315 else: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2316 lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2317 |
34397 | 2318 elif has_factory: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2319 arg = "%s=NOTHING" % (arg_name,) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2320 if a.kw_only: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2321 kw_only_args.append(arg) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2322 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2323 args.append(arg) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2324 lines.append("if %s is not NOTHING:" % (arg_name,)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2325 |
34397 | 2326 init_factory_name = _init_factory_pat.format(a.name) |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2327 if a.converter is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2328 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2329 " " |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2330 + fmt_setter_with_converter( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2331 attr_name, arg_name, has_on_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2332 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2333 ) |
34397 | 2334 lines.append("else:") |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2335 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2336 " " |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2337 + fmt_setter_with_converter( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2338 attr_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2339 init_factory_name + "(" + maybe_self + ")", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2340 has_on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2341 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2342 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2343 names_for_globals[ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2344 _init_converter_pat % (a.name,) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2345 ] = a.converter |
34397 | 2346 else: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2347 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2348 " " + fmt_setter(attr_name, arg_name, has_on_setattr) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2349 ) |
34397 | 2350 lines.append("else:") |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2351 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2352 " " |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2353 + fmt_setter( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2354 attr_name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2355 init_factory_name + "(" + maybe_self + ")", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2356 has_on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2357 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2358 ) |
34397 | 2359 names_for_globals[init_factory_name] = a.default.factory |
2360 else: | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2361 if a.kw_only: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2362 kw_only_args.append(arg_name) |
34397 | 2363 else: |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2364 args.append(arg_name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2365 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2366 if a.converter is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2367 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2368 fmt_setter_with_converter( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2369 attr_name, arg_name, has_on_setattr |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2370 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2371 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2372 names_for_globals[ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2373 _init_converter_pat % (a.name,) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2374 ] = a.converter |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2375 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2376 lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2377 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2378 if a.init is True: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2379 if a.type is not None and a.converter is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2380 annotations[arg_name] = a.type |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2381 elif a.converter is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2382 # Try to get the type from the converter. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2383 t = _AnnotationExtractor(a.converter).get_first_param_type() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2384 if t: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2385 annotations[arg_name] = t |
34397 | 2386 |
2387 if attrs_to_validate: # we can skip this if there are no validators. | |
2388 names_for_globals["_config"] = _config | |
2389 lines.append("if _config._run_validators is True:") | |
2390 for a in attrs_to_validate: | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2391 val_name = "__attr_validator_" + a.name |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2392 attr_name = "__attr_" + a.name |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2393 lines.append( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2394 " %s(self, %s, self.%s)" % (val_name, attr_name, a.name) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2395 ) |
34397 | 2396 names_for_globals[val_name] = a.validator |
2397 names_for_globals[attr_name] = a | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2398 |
34397 | 2399 if post_init: |
2400 lines.append("self.__attrs_post_init__()") | |
2401 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2402 # because this is set only after __attrs_post_init__ is called, a crash |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2403 # will result if post-init tries to access the hash code. This seemed |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2404 # preferable to setting this beforehand, in which case alteration to |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2405 # field values during post-init combined with post-init accessing the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2406 # hash code would result in silent bugs. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2407 if cache_hash: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2408 if frozen: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2409 if slots: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2410 # if frozen and slots, then _setattr defined above |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2411 init_hash_cache = "_setattr(self, '%s', %s)" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2412 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2413 # if frozen and not slots, then _inst_dict defined above |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2414 init_hash_cache = "_inst_dict['%s'] = %s" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2415 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2416 init_hash_cache = "self.%s = %s" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2417 lines.append(init_hash_cache % (_hash_cache_field, "None")) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2418 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2419 # For exceptions we rely on BaseException.__init__ for proper |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2420 # initialization. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2421 if is_exc: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2422 vals = ",".join("self." + a.name for a in attrs if a.init) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2423 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2424 lines.append("BaseException.__init__(self, %s)" % (vals,)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2425 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2426 args = ", ".join(args) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2427 if kw_only_args: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2428 args += "%s*, %s" % ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2429 ", " if args else "", # leading comma |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2430 ", ".join(kw_only_args), # kw_only args |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2431 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2432 return ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2433 """\ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2434 def {init_name}(self, {args}): |
34397 | 2435 {lines} |
2436 """.format( | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2437 init_name=("__attrs_init__" if attrs_init else "__init__"), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2438 args=args, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2439 lines="\n ".join(lines) if lines else "pass", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2440 ), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2441 names_for_globals, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2442 annotations, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2443 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2444 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2445 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2446 class Attribute: |
34397 | 2447 """ |
2448 *Read-only* representation of an attribute. | |
2449 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2450 The class has *all* arguments of `attr.ib` (except for ``factory`` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2451 which is only syntactic sugar for ``default=Factory(...)`` plus the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2452 following: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2453 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2454 - ``name`` (`str`): The name of the attribute. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2455 - ``inherited`` (`bool`): Whether or not that attribute has been inherited |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2456 from a base class. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2457 - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The callables |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2458 that are used for comparing and ordering objects by this attribute, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2459 respectively. These are set by passing a callable to `attr.ib`'s ``eq``, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2460 ``order``, or ``cmp`` arguments. See also :ref:`comparison customization |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2461 <custom-comparison>`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2462 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2463 Instances of this class are frequently used for introspection purposes |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2464 like: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2465 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2466 - `fields` returns a tuple of them. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2467 - Validators get them passed as the first argument. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2468 - The :ref:`field transformer <transform-fields>` hook receives a list of |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2469 them. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2470 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2471 .. versionadded:: 20.1.0 *inherited* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2472 .. versionadded:: 20.1.0 *on_setattr* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2473 .. versionchanged:: 20.2.0 *inherited* is not taken into account for |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2474 equality checks and hashing anymore. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2475 .. versionadded:: 21.1.0 *eq_key* and *order_key* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2476 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2477 For the full version history of the fields, see `attr.ib`. |
34397 | 2478 """ |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2479 |
34397 | 2480 __slots__ = ( |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2481 "name", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2482 "default", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2483 "validator", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2484 "repr", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2485 "eq", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2486 "eq_key", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2487 "order", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2488 "order_key", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2489 "hash", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2490 "init", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2491 "metadata", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2492 "type", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2493 "converter", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2494 "kw_only", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2495 "inherited", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2496 "on_setattr", |
34397 | 2497 ) |
2498 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2499 def __init__( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2500 self, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2501 name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2502 default, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2503 validator, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2504 repr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2505 cmp, # XXX: unused, remove along with other cmp code. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2506 hash, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2507 init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2508 inherited, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2509 metadata=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2510 type=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2511 converter=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2512 kw_only=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2513 eq=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2514 eq_key=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2515 order=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2516 order_key=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2517 on_setattr=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2518 ): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2519 eq, eq_key, order, order_key = _determine_attrib_eq_order( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2520 cmp, eq_key or eq, order_key or order, True |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2521 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2522 |
34397 | 2523 # Cache this descriptor here to speed things up later. |
2524 bound_setattr = _obj_setattr.__get__(self, Attribute) | |
2525 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2526 # Despite the big red warning, people *do* instantiate `Attribute` |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2527 # themselves. |
34397 | 2528 bound_setattr("name", name) |
2529 bound_setattr("default", default) | |
2530 bound_setattr("validator", validator) | |
2531 bound_setattr("repr", repr) | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2532 bound_setattr("eq", eq) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2533 bound_setattr("eq_key", eq_key) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2534 bound_setattr("order", order) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2535 bound_setattr("order_key", order_key) |
34397 | 2536 bound_setattr("hash", hash) |
2537 bound_setattr("init", init) | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2538 bound_setattr("converter", converter) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2539 bound_setattr( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2540 "metadata", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2541 ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2542 types.MappingProxyType(dict(metadata)) # Shallow copy |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2543 if metadata |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2544 else _empty_metadata_singleton |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2545 ), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2546 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2547 bound_setattr("type", type) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2548 bound_setattr("kw_only", kw_only) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2549 bound_setattr("inherited", inherited) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2550 bound_setattr("on_setattr", on_setattr) |
34397 | 2551 |
2552 def __setattr__(self, name, value): | |
2553 raise FrozenInstanceError() | |
2554 | |
2555 @classmethod | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2556 def from_counting_attr(cls, name, ca, type=None): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2557 # type holds the annotated value. deal with conflicts: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2558 if type is None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2559 type = ca.type |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2560 elif ca.type is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2561 raise ValueError( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2562 "Type annotation and type argument cannot both be present" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2563 ) |
34397 | 2564 inst_dict = { |
2565 k: getattr(ca, k) | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2566 for k in Attribute.__slots__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2567 if k |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2568 not in ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2569 "name", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2570 "validator", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2571 "default", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2572 "type", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2573 "inherited", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2574 ) # exclude methods and deprecated alias |
34397 | 2575 } |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2576 return cls( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2577 name=name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2578 validator=ca._validator, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2579 default=ca._default, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2580 type=type, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2581 cmp=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2582 inherited=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2583 **inst_dict |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2584 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2585 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2586 # Don't use attr.evolve since fields(Attribute) doesn't work |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2587 def evolve(self, **changes): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2588 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2589 Copy *self* and apply *changes*. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2590 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2591 This works similarly to `attr.evolve` but that function does not work |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2592 with ``Attribute``. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2593 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2594 It is mainly meant to be used for `transform-fields`. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2595 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2596 .. versionadded:: 20.3.0 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2597 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2598 new = copy.copy(self) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2599 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2600 new._setattrs(changes.items()) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2601 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2602 return new |
34397 | 2603 |
2604 # Don't use _add_pickle since fields(Attribute) doesn't work | |
2605 def __getstate__(self): | |
2606 """ | |
2607 Play nice with pickle. | |
2608 """ | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2609 return tuple( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2610 getattr(self, name) if name != "metadata" else dict(self.metadata) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2611 for name in self.__slots__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2612 ) |
34397 | 2613 |
2614 def __setstate__(self, state): | |
2615 """ | |
2616 Play nice with pickle. | |
2617 """ | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2618 self._setattrs(zip(self.__slots__, state)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2619 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2620 def _setattrs(self, name_values_pairs): |
34397 | 2621 bound_setattr = _obj_setattr.__get__(self, Attribute) |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2622 for name, value in name_values_pairs: |
34397 | 2623 if name != "metadata": |
2624 bound_setattr(name, value) | |
2625 else: | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2626 bound_setattr( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2627 name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2628 types.MappingProxyType(dict(value)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2629 if value |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2630 else _empty_metadata_singleton, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2631 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2632 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2633 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2634 _a = [ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2635 Attribute( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2636 name=name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2637 default=NOTHING, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2638 validator=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2639 repr=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2640 cmp=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2641 eq=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2642 order=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2643 hash=(name != "metadata"), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2644 init=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2645 inherited=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2646 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2647 for name in Attribute.__slots__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2648 ] |
34397 | 2649 |
2650 Attribute = _add_hash( | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2651 _add_eq( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2652 _add_repr(Attribute, attrs=_a), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2653 attrs=[a for a in _a if a.name != "inherited"], |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2654 ), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2655 attrs=[a for a in _a if a.hash and a.name != "inherited"], |
34397 | 2656 ) |
2657 | |
2658 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2659 class _CountingAttr: |
34397 | 2660 """ |
2661 Intermediate representation of attributes that uses a counter to preserve | |
2662 the order in which the attributes have been defined. | |
2663 | |
2664 *Internal* data structure of the attrs library. Running into is most | |
2665 likely the result of a bug like a forgotten `@attr.s` decorator. | |
2666 """ | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2667 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2668 __slots__ = ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2669 "counter", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2670 "_default", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2671 "repr", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2672 "eq", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2673 "eq_key", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2674 "order", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2675 "order_key", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2676 "hash", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2677 "init", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2678 "metadata", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2679 "_validator", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2680 "converter", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2681 "type", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2682 "kw_only", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2683 "on_setattr", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2684 ) |
34397 | 2685 __attrs_attrs__ = tuple( |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2686 Attribute( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2687 name=name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2688 default=NOTHING, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2689 validator=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2690 repr=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2691 cmp=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2692 hash=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2693 init=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2694 kw_only=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2695 eq=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2696 eq_key=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2697 order=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2698 order_key=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2699 inherited=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2700 on_setattr=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2701 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2702 for name in ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2703 "counter", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2704 "_default", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2705 "repr", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2706 "eq", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2707 "order", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2708 "hash", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2709 "init", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2710 "on_setattr", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2711 ) |
34397 | 2712 ) + ( |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2713 Attribute( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2714 name="metadata", |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2715 default=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2716 validator=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2717 repr=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2718 cmp=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2719 hash=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2720 init=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2721 kw_only=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2722 eq=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2723 eq_key=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2724 order=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2725 order_key=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2726 inherited=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2727 on_setattr=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2728 ), |
34397 | 2729 ) |
2730 cls_counter = 0 | |
2731 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2732 def __init__( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2733 self, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2734 default, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2735 validator, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2736 repr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2737 cmp, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2738 hash, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2739 init, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2740 converter, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2741 metadata, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2742 type, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2743 kw_only, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2744 eq, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2745 eq_key, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2746 order, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2747 order_key, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2748 on_setattr, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2749 ): |
34397 | 2750 _CountingAttr.cls_counter += 1 |
2751 self.counter = _CountingAttr.cls_counter | |
2752 self._default = default | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2753 self._validator = validator |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2754 self.converter = converter |
34397 | 2755 self.repr = repr |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2756 self.eq = eq |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2757 self.eq_key = eq_key |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2758 self.order = order |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2759 self.order_key = order_key |
34397 | 2760 self.hash = hash |
2761 self.init = init | |
2762 self.metadata = metadata | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2763 self.type = type |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2764 self.kw_only = kw_only |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2765 self.on_setattr = on_setattr |
34397 | 2766 |
2767 def validator(self, meth): | |
2768 """ | |
2769 Decorator that adds *meth* to the list of validators. | |
2770 | |
2771 Returns *meth* unchanged. | |
2772 | |
2773 .. versionadded:: 17.1.0 | |
2774 """ | |
2775 if self._validator is None: | |
2776 self._validator = meth | |
2777 else: | |
2778 self._validator = and_(self._validator, meth) | |
2779 return meth | |
2780 | |
2781 def default(self, meth): | |
2782 """ | |
2783 Decorator that allows to set the default for an attribute. | |
2784 | |
2785 Returns *meth* unchanged. | |
2786 | |
2787 :raises DefaultAlreadySetError: If default has been set before. | |
2788 | |
2789 .. versionadded:: 17.1.0 | |
2790 """ | |
2791 if self._default is not NOTHING: | |
2792 raise DefaultAlreadySetError() | |
2793 | |
2794 self._default = Factory(meth, takes_self=True) | |
2795 | |
2796 return meth | |
2797 | |
2798 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2799 _CountingAttr = _add_eq(_add_repr(_CountingAttr)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2800 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2801 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2802 class Factory: |
34397 | 2803 """ |
2804 Stores a factory callable. | |
2805 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2806 If passed as the default value to `attrs.field`, the factory is used to |
34397 | 2807 generate a new value. |
2808 | |
2809 :param callable factory: A callable that takes either none or exactly one | |
2810 mandatory positional argument depending on *takes_self*. | |
2811 :param bool takes_self: Pass the partially initialized instance that is | |
2812 being initialized as a positional argument. | |
2813 | |
2814 .. versionadded:: 17.1.0 *takes_self* | |
2815 """ | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2816 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2817 __slots__ = ("factory", "takes_self") |
34397 | 2818 |
2819 def __init__(self, factory, takes_self=False): | |
2820 """ | |
2821 `Factory` is part of the default machinery so if we want a default | |
2822 value here, we have to implement it ourselves. | |
2823 """ | |
2824 self.factory = factory | |
2825 self.takes_self = takes_self | |
2826 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2827 def __getstate__(self): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2828 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2829 Play nice with pickle. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2830 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2831 return tuple(getattr(self, name) for name in self.__slots__) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2832 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2833 def __setstate__(self, state): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2834 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2835 Play nice with pickle. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2836 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2837 for name, value in zip(self.__slots__, state): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2838 setattr(self, name, value) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2839 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2840 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2841 _f = [ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2842 Attribute( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2843 name=name, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2844 default=NOTHING, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2845 validator=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2846 repr=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2847 cmp=None, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2848 eq=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2849 order=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2850 hash=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2851 init=True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2852 inherited=False, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2853 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2854 for name in Factory.__slots__ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2855 ] |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2856 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2857 Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2858 |
34397 | 2859 |
2860 def make_class(name, attrs, bases=(object,), **attributes_arguments): | |
2861 """ | |
2862 A quick way to create a new class called *name* with *attrs*. | |
2863 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2864 :param str name: The name for the new class. |
34397 | 2865 |
2866 :param attrs: A list of names or a dictionary of mappings of names to | |
2867 attributes. | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2868 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2869 If *attrs* is a list or an ordered dict (`dict` on Python 3.6+, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2870 `collections.OrderedDict` otherwise), the order is deduced from |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2871 the order of the names or attributes inside *attrs*. Otherwise the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2872 order of the definition of the attributes is used. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2873 :type attrs: `list` or `dict` |
34397 | 2874 |
2875 :param tuple bases: Classes that the new class will subclass. | |
2876 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2877 :param attributes_arguments: Passed unmodified to `attr.s`. |
34397 | 2878 |
2879 :return: A new class with *attrs*. | |
2880 :rtype: type | |
2881 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2882 .. versionadded:: 17.1.0 *bases* |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2883 .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. |
34397 | 2884 """ |
2885 if isinstance(attrs, dict): | |
2886 cls_dict = attrs | |
2887 elif isinstance(attrs, (list, tuple)): | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2888 cls_dict = {a: attrib() for a in attrs} |
34397 | 2889 else: |
2890 raise TypeError("attrs argument must be a dict or a list.") | |
2891 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2892 pre_init = cls_dict.pop("__attrs_pre_init__", None) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2893 post_init = cls_dict.pop("__attrs_post_init__", None) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2894 user_init = cls_dict.pop("__init__", None) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2895 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2896 body = {} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2897 if pre_init is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2898 body["__attrs_pre_init__"] = pre_init |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2899 if post_init is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2900 body["__attrs_post_init__"] = post_init |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2901 if user_init is not None: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2902 body["__init__"] = user_init |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2903 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2904 type_ = types.new_class(name, bases, {}, lambda ns: ns.update(body)) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2905 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2906 # For pickling to work, the __module__ variable needs to be set to the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2907 # frame where the class is created. Bypass this step in environments where |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2908 # sys._getframe is not defined (Jython for example) or sys._getframe is not |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2909 # defined for arguments greater than 0 (IronPython). |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2910 try: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2911 type_.__module__ = sys._getframe(1).f_globals.get( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2912 "__name__", "__main__" |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2913 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2914 except (AttributeError, ValueError): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2915 pass |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2916 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2917 # We do it here for proper warnings with meaningful stacklevel. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2918 cmp = attributes_arguments.pop("cmp", None) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2919 ( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2920 attributes_arguments["eq"], |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2921 attributes_arguments["order"], |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2922 ) = _determine_attrs_eq_order( |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2923 cmp, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2924 attributes_arguments.get("eq"), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2925 attributes_arguments.get("order"), |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2926 True, |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2927 ) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2928 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2929 return _attrs(these=cls_dict, **attributes_arguments)(type_) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2930 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2931 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2932 # These are required by within this module so we define them here and merely |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2933 # import into .validators / .converters. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2934 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2935 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2936 @attrs(slots=True, hash=True) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2937 class _AndValidator: |
34397 | 2938 """ |
2939 Compose many validators to a single one. | |
2940 """ | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2941 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2942 _validators = attrib() |
34397 | 2943 |
2944 def __call__(self, inst, attr, value): | |
2945 for v in self._validators: | |
2946 v(inst, attr, value) | |
2947 | |
2948 | |
2949 def and_(*validators): | |
2950 """ | |
2951 A validator that composes multiple validators into one. | |
2952 | |
2953 When called on a value, it runs all wrapped validators. | |
2954 | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2955 :param callables validators: Arbitrary number of validators. |
34397 | 2956 |
2957 .. versionadded:: 17.1.0 | |
2958 """ | |
2959 vals = [] | |
2960 for validator in validators: | |
2961 vals.extend( | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2962 validator._validators |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2963 if isinstance(validator, _AndValidator) |
34397 | 2964 else [validator] |
2965 ) | |
2966 | |
2967 return _AndValidator(tuple(vals)) | |
49643
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2968 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2969 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2970 def pipe(*converters): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2971 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2972 A converter that composes multiple converters into one. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2973 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2974 When called on a value, it runs all wrapped converters, returning the |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2975 *last* value. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2976 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2977 Type annotations will be inferred from the wrapped converters', if |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2978 they have any. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2979 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2980 :param callables converters: Arbitrary number of converters. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2981 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2982 .. versionadded:: 20.1.0 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2983 """ |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2984 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2985 def pipe_converter(val): |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2986 for converter in converters: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2987 val = converter(val) |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2988 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2989 return val |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2990 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2991 if not converters: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2992 # If the converter list is empty, pipe_converter is the identity. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2993 A = typing.TypeVar("A") |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2994 pipe_converter.__annotations__ = {"val": A, "return": A} |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2995 else: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2996 # Get parameter type from first converter. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2997 t = _AnnotationExtractor(converters[0]).get_first_param_type() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2998 if t: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
2999 pipe_converter.__annotations__["val"] = t |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
3000 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
3001 # Get return type from last converter. |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
3002 rt = _AnnotationExtractor(converters[-1]).get_return_type() |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
3003 if rt: |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
3004 pipe_converter.__annotations__["return"] = rt |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
3005 |
e1c586b9a43c
attr: vendor 22.1.0
Matt Harbison <matt_harbison@yahoo.com>
parents:
41833
diff
changeset
|
3006 return pipe_converter |