comparison env/lib/python3.9/site-packages/attr/converters.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 """
2 Commonly useful converters.
3 """
4
5 from __future__ import absolute_import, division, print_function
6
7 from ._make import NOTHING, Factory, pipe
8
9
10 __all__ = [
11 "pipe",
12 "optional",
13 "default_if_none",
14 ]
15
16
17 def optional(converter):
18 """
19 A converter that allows an attribute to be optional. An optional attribute
20 is one which can be set to ``None``.
21
22 :param callable converter: the converter that is used for non-``None``
23 values.
24
25 .. versionadded:: 17.1.0
26 """
27
28 def optional_converter(val):
29 if val is None:
30 return None
31 return converter(val)
32
33 return optional_converter
34
35
36 def default_if_none(default=NOTHING, factory=None):
37 """
38 A converter that allows to replace ``None`` values by *default* or the
39 result of *factory*.
40
41 :param default: Value to be used if ``None`` is passed. Passing an instance
42 of `attr.Factory` is supported, however the ``takes_self`` option
43 is *not*.
44 :param callable factory: A callable that takes not parameters whose result
45 is used if ``None`` is passed.
46
47 :raises TypeError: If **neither** *default* or *factory* is passed.
48 :raises TypeError: If **both** *default* and *factory* are passed.
49 :raises ValueError: If an instance of `attr.Factory` is passed with
50 ``takes_self=True``.
51
52 .. versionadded:: 18.2.0
53 """
54 if default is NOTHING and factory is None:
55 raise TypeError("Must pass either `default` or `factory`.")
56
57 if default is not NOTHING and factory is not None:
58 raise TypeError(
59 "Must pass either `default` or `factory` but not both."
60 )
61
62 if factory is not None:
63 default = Factory(factory)
64
65 if isinstance(default, Factory):
66 if default.takes_self:
67 raise ValueError(
68 "`takes_self` is not supported by default_if_none."
69 )
70
71 def default_if_none_converter(val):
72 if val is not None:
73 return val
74
75 return default.factory()
76
77 else:
78
79 def default_if_none_converter(val):
80 if val is not None:
81 return val
82
83 return default
84
85 return default_if_none_converter