Skip to content

Commit 2606efb

Browse files
committed
make error and value private fields accessed by properties
add types e.error unwraps
1 parent 6f2fe68 commit 2606efb

3 files changed

Lines changed: 28 additions & 14 deletions

File tree

src/outcome/_impl.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -164,22 +164,22 @@ class Value(Outcome[ValueT], Generic[ValueT]):
164164
165165
"""
166166

167-
value: ValueT = attr.ib()
167+
_value: ValueT = attr.ib()
168168
"""The contained value."""
169169

170170
def __repr__(self) -> str:
171171
try:
172-
return f'Value({self.value!r})'
172+
return f'Value({self._value!r})'
173173
except AttributeError:
174174
return f'Value(<AlreadyUsed>)'
175175

176176
def unwrap(self) -> ValueT:
177177
try:
178-
v = self.value
178+
v = self._value
179179
except AttributeError:
180180
pass
181181
else:
182-
object.__delattr__(self, "value")
182+
object.__delattr__(self, "_value")
183183
return v
184184
raise AlreadyUsedError
185185

@@ -189,6 +189,10 @@ def send(self, gen: Generator[ResultT, ValueT, object]) -> ResultT:
189189
async def asend(self, agen: AsyncGenerator[ResultT, ValueT]) -> ResultT:
190190
return await agen.asend(self.unwrap())
191191

192+
@property
193+
def value(self) -> ValueT:
194+
return self.unwrap()
195+
192196

193197
@final
194198
@attr.s(frozen=True, repr=False, slots=True)
@@ -197,24 +201,24 @@ class Error(Outcome[NoReturn]):
197201
198202
"""
199203

200-
error: BaseException = attr.ib(
204+
_error: BaseException = attr.ib(
201205
validator=attr.validators.instance_of(BaseException)
202206
)
203207
"""The contained exception object."""
204208

205209
def __repr__(self) -> str:
206210
try:
207-
return f'Error({self.error!r})'
211+
return f'Error({self._error!r})'
208212
except AttributeError:
209213
return 'Error(<AlreadyUsed>)'
210214

211215
def _unwrap_error(self) -> BaseException:
212216
try:
213-
v = self.error
217+
v = self._error
214218
except AttributeError:
215219
pass
216220
else:
217-
object.__delattr__(self, "error")
221+
object.__delattr__(self, "_error")
218222
return v
219223
raise AlreadyUsedError
220224

@@ -245,6 +249,10 @@ def send(self, gen: Generator[ResultT, NoReturn, object]) -> ResultT:
245249
async def asend(self, agen: AsyncGenerator[ResultT, NoReturn]) -> ResultT:
246250
return await agen.athrow(self._unwrap_error())
247251

252+
@property
253+
def error(self) -> BaseException:
254+
return self._unwrap_error()
255+
248256

249257
# A convenience alias to a union of both results, allowing exhaustiveness checking.
250258
Maybe = Union[Value[ValueT], Error]

tests/test_async.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ async def raise_ValueError(x):
2222
raise ValueError(x)
2323

2424
e = await outcome.acapture(raise_ValueError, 9)
25-
assert type(e.error) is ValueError
26-
assert e.error.args == (9,)
25+
error = e.error
26+
assert type(error) is ValueError
27+
assert error.args == (9,)
2728

2829

2930
async def test_asend():

tests/test_sync.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
def test_Outcome():
1111
v = Value(1)
1212
assert v.value == 1
13+
v = Value(1)
1314
assert repr(v) == "Value(1)"
1415
assert v.unwrap() == 1
1516
assert repr(v) == "Value(<AlreadyUsed>)"
@@ -21,13 +22,16 @@ def test_Outcome():
2122

2223
exc = RuntimeError("oops")
2324
e = Error(exc)
24-
assert e.error is exc
25+
error = e.error
26+
assert error is exc
27+
e = Error(exc)
2528
assert repr(e) == f"Error({exc!r})"
29+
e = Error(exc)
2630
with pytest.raises(RuntimeError):
2731
e.unwrap()
2832
with pytest.raises(AlreadyUsedError):
2933
e.unwrap()
30-
assert repr(e) == "Error(<DEAD>)"
34+
assert repr(e) == "Error(<AlreadyUsed>)"
3135

3236
e = Error(exc)
3337
with pytest.raises(TypeError):
@@ -101,8 +105,9 @@ def raise_ValueError(x):
101105

102106
e = outcome.capture(raise_ValueError, "two")
103107
assert type(e) == Error
104-
assert type(e.error) is ValueError
105-
assert e.error.args == ("two",)
108+
error = e.error
109+
assert type(error) is ValueError
110+
assert error.args == ("two",)
106111

107112

108113
def test_inheritance():

0 commit comments

Comments
 (0)