class_docstr: Wrapper class that defines synchronous `_sync` method wrappers
  
  around async-native methods.
  
  Every coroutine method automatically gets an `_sync` alias
  that runs it synchronously.
class_docstr_tok: ["Wrapper","class","that","defines","synchronous","`","_sync","`","method","wrappers","around","async-native","methods",".","Every","coroutine","method","automatically","gets","an","`","_sync","`","alias","that","runs","it","synchronously","."]
code: def __getattr__(self, name):
      if name.endswith("_sync"):
          # lazily define `_sync` method wrappers for coroutine methods
          async_name = name[:-5]
          async_method = super().__getattribute__(async_name)
          if not inspect.iscoroutinefunction(async_method):
              raise AttributeError(async_name)
          return partial(self._synchronize, async_method)
      return super().__getattribute__(name)
  
file_path: ipyparallel/ipyparallel/_async.py
imports: import asyncio
  import concurrent.futures
  import inspect
  import threading
  from functools import partial
  from tornado.ioloop import IOLoop
label_desc: Use image node_id 4 for calling the AsyncFirst obj's underlying member method code with example usage: obj.__getattr__(name) and returns: super, partial