Spruce up docstrings

pull/24523/head
Richard Belleville 5 years ago
parent f2059ee6be
commit 928e3b2fa5
  1. 38
      src/python/grpcio/grpc/_channel.py
  2. 4
      src/python/grpcio_tests/tests/unit/_interceptor_test.py

@ -448,13 +448,17 @@ class _SingleThreadedRendezvous(_Rendezvous, grpc.Call, grpc.Future): # pylint:
The __next__ method of _SingleThreadedRendezvous does not depend on the The __next__ method of _SingleThreadedRendezvous does not depend on the
existence of any other thread, including the "channel spin thread". existence of any other thread, including the "channel spin thread".
However, this means that its interface is entirely synchronous. So this However, this means that its interface is entirely synchronous. So this
class cannot fulfill the grpc.Future interface. class cannot completely fulfill the grpc.Future interface. The result,
exception, and traceback methods will never block and will instead raise
an exception if calling the method would result in blocking.
This means that these methods are safe to call from add_done_callback
handlers.
""" """
def _is_complete(self): def _is_complete(self):
return self._state.code is not None return self._state.code is not None
def cancelled(self): def cancelled(self):
with self._state.condition: with self._state.condition:
return self._state.cancelled return self._state.cancelled
@ -468,9 +472,17 @@ class _SingleThreadedRendezvous(_Rendezvous, grpc.Call, grpc.Future): # pylint:
return self._state.code is not None return self._state.code is not None
def result(self, timeout=None): def result(self, timeout=None):
"""Returns the result of the computation or raises its exception.
This method will never block. Instead, it will raise an exception
if calling this method would otherwise result in blocking.
"""
del timeout
with self._state.condition: with self._state.condition:
if not self._is_complete(): if not self._is_complete():
raise Exception("_SingleThreadedRendezvous only supports result() when the RPC is complete.") raise grpc.experimental.UsageError(
"_SingleThreadedRendezvous only supports result() when the RPC is complete."
)
if self._state.code is grpc.StatusCode.OK: if self._state.code is grpc.StatusCode.OK:
return self._state.response return self._state.response
elif self._state.cancelled: elif self._state.cancelled:
@ -479,9 +491,17 @@ class _SingleThreadedRendezvous(_Rendezvous, grpc.Call, grpc.Future): # pylint:
raise self raise self
def exception(self, timeout=None): def exception(self, timeout=None):
"""Return the exception raised by the computation.
This method will never block. Instead, it will raise an exception
if calling this method would otherwise result in blocking.
"""
del timeout
with self._state.condition: with self._state.condition:
if not self._is_complete(): if not self._is_complete():
raise Exception("_SingleThreadedRendezvous only supports exception() when the RPC is complete.") raise grpc.experimental.UsageError(
"_SingleThreadedRendezvous only supports exception() when the RPC is complete."
)
if self._state.code is grpc.StatusCode.OK: if self._state.code is grpc.StatusCode.OK:
return None return None
elif self._state.cancelled: elif self._state.cancelled:
@ -490,9 +510,17 @@ class _SingleThreadedRendezvous(_Rendezvous, grpc.Call, grpc.Future): # pylint:
return self return self
def traceback(self, timeout=None): def traceback(self, timeout=None):
"""Access the traceback of the exception raised by the computation.
This method will never block. Instead, it will raise an exception
if calling this method would otherwise result in blocking.
"""
del timeout
with self._state.condition: with self._state.condition:
if not self._is_complete(): if not self._is_complete():
raise Exception("_SingleThreadedRendezvous only supports traceback() when the RPC is complete.") raise grpc.experimental.UsageError(
"_SingleThreadedRendezvous only supports traceback() when the RPC is complete."
)
if self._state.code is grpc.StatusCode.OK: if self._state.code is grpc.StatusCode.OK:
return None return None
elif self._state.cancelled: elif self._state.cancelled:

@ -547,10 +547,6 @@ class InterceptorTest(unittest.TestCase):
's1:intercept_service', 's2:intercept_service' 's1:intercept_service', 's2:intercept_service'
]) ])
# NOTE: The single-threaded unary-stream path does not support the
# grpc.Future interface, so this test does not apply.
# @unittest.skipIf(os.getenv("GRPC_SINGLE_THREADED_UNARY_STREAM"),
# "Not supported.")
def testInterceptedUnaryRequestStreamResponseWithError(self): def testInterceptedUnaryRequestStreamResponseWithError(self):
request = _EXCEPTION_REQUEST request = _EXCEPTION_REQUEST

Loading…
Cancel
Save