aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/attrs/attr/setters.py
blob: c936c39053c4b71710e4e2ead25243cdacc625e7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
""" 
Commonly used hooks for on_setattr. 
""" 
 
from __future__ import absolute_import, division, print_function 
 
from . import _config 
from .exceptions import FrozenAttributeError 
 
 
def pipe(*setters): 
    """ 
    Run all *setters* and return the return value of the last one. 
 
    .. versionadded:: 20.1.0 
    """ 
 
    def wrapped_pipe(instance, attrib, new_value): 
        rv = new_value 
 
        for setter in setters: 
            rv = setter(instance, attrib, rv) 
 
        return rv 
 
    return wrapped_pipe 
 
 
def frozen(_, __, ___): 
    """ 
    Prevent an attribute to be modified. 
 
    .. versionadded:: 20.1.0 
    """ 
    raise FrozenAttributeError() 
 
 
def validate(instance, attrib, new_value): 
    """ 
    Run *attrib*'s validator on *new_value* if it has one. 
 
    .. versionadded:: 20.1.0 
    """ 
    if _config._run_validators is False: 
        return new_value 
 
    v = attrib.validator 
    if not v: 
        return new_value 
 
    v(instance, attrib, new_value) 
 
    return new_value 
 
 
def convert(instance, attrib, new_value): 
    """ 
    Run *attrib*'s converter -- if it has one --  on *new_value* and return the 
    result. 
 
    .. versionadded:: 20.1.0 
    """ 
    c = attrib.converter 
    if c: 
        return c(new_value) 
 
    return new_value 
 
 
NO_OP = object() 
""" 
Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. 
 
Does not work in `pipe` or within lists. 
 
.. versionadded:: 20.1.0 
"""