Skip to content

Commit fdbd48d

Browse files
committed
make error and value private fields accessed by properties attempt 2
1 parent a28ec1a commit fdbd48d

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

src/outcome/_impl.py

Lines changed: 25 additions & 9 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
179-
except AttributeError:
178+
v = self._value
179+
except AttributeError as e:
180180
pass
181181
else:
182-
object.__delattr__(self, "value")
182+
object.__delattr__(self, "_value")
183183
return v
184184
raise AlreadyUsedError
185185

@@ -189,6 +189,14 @@ 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+
try:
195+
return self._value
196+
except AttributeError as e:
197+
pass
198+
raise AlreadyUsedError
199+
192200

193201
@final
194202
@attr.s(frozen=True, repr=False, slots=True)
@@ -197,24 +205,24 @@ class Error(Outcome[NoReturn]):
197205
198206
"""
199207

200-
error: BaseException = attr.ib(
208+
_error: BaseException = attr.ib(
201209
validator=attr.validators.instance_of(BaseException)
202210
)
203211
"""The contained exception object."""
204212

205213
def __repr__(self) -> str:
206214
try:
207-
return f'Error({self.error!r})'
215+
return f'Error({self._error!r})'
208216
except AttributeError:
209217
return 'Error(<AlreadyUsed>)'
210218

211219
def _unwrap_error(self) -> BaseException:
212220
try:
213-
v = self.error
221+
v = self._error
214222
except AttributeError:
215223
pass
216224
else:
217-
object.__delattr__(self, "error")
225+
object.__delattr__(self, "_error")
218226
return v
219227
raise AlreadyUsedError
220228

@@ -245,6 +253,14 @@ def send(self, gen: Generator[ResultT, NoReturn, object]) -> ResultT:
245253
async def asend(self, agen: AsyncGenerator[ResultT, NoReturn]) -> ResultT:
246254
return await agen.athrow(self._unwrap_error())
247255

256+
@property
257+
def error(self) -> BaseException:
258+
try:
259+
return self._error
260+
except AttributeError:
261+
pass
262+
raise AlreadyUsedError
263+
248264

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

tests/test_sync.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def test_Outcome():
2727
e.unwrap()
2828
with pytest.raises(AlreadyUsedError):
2929
e.unwrap()
30-
assert repr(e) == "Error(<DEAD>)"
30+
assert repr(e) == "Error(<AlreadyUsed>)"
3131

3232
e = Error(exc)
3333
with pytest.raises(TypeError):

0 commit comments

Comments
 (0)