async def transaction(self, func, *watches, **kwargs):
        """
        Convenience method for executing the callable `func` as a transaction
        while watching all keys specified in `watches`. The 'func' callable
        should expect a single argument which is a Pipeline object.
        """
        shard_hint = kwargs.pop('shard_hint', None)
        value_from_callable = kwargs.pop('value_from_callable', False)
        watch_delay = kwargs.pop('watch_delay', None)
        async with await self.pipeline(True, shard_hint) as pipe:
            while True:
                try:
                    if watches:
                        await pipe.watch(*watches)
                    func_value = await func(pipe)
                    exec_value = await pipe.execute()
                    return func_value if value_from_callable else exec_value
                except WatchError:
                    if watch_delay is not None and watch_delay > 0:
                        await asyncio.sleep(
                            watch_delay,
                            loop=self.connection_pool.loop
                        )
                    continue
async def transaction ( self , func , * watches , ** kwargs ) : shard_hint = kwargs . pop ( 'shard_hint' , None ) value_from_callable = kwargs . pop ( 'value_from_callable' , False ) watch_delay = kwargs . pop ( 'watch_delay' , None ) async with await self . pipeline ( True , shard_hint ) as pipe : while True : try : if watches : await pipe . watch ( * watches ) func_value = await func ( pipe ) exec_value = await pipe . execute ( ) return func_value if value_from_callable else exec_value except WatchError : if watch_delay is not None and watch_delay > 0 : await asyncio . sleep ( watch_delay , loop = self . connection_pool . loop ) continue
Convenience method for executing the callable `func` as a transaction
        while watching all keys specified in `watches`. The 'func' callable
        should expect a single argument which is a Pipeline object.