Uploaded Test files
This commit is contained in:
parent
f584ad9d97
commit
2e81cb7d99
16627 changed files with 2065359 additions and 102444 deletions
188
venv/Lib/site-packages/zmq/decorators.py
Normal file
188
venv/Lib/site-packages/zmq/decorators.py
Normal file
|
@ -0,0 +1,188 @@
|
|||
"""Decorators for running functions with context/sockets.
|
||||
|
||||
.. versionadded:: 15.3
|
||||
|
||||
Like using Contexts and Sockets as context managers, but with decorator syntax.
|
||||
Context and sockets are closed at the end of the function.
|
||||
|
||||
For example::
|
||||
|
||||
from zmq.decorators import context, socket
|
||||
|
||||
@context()
|
||||
@socket(zmq.PUSH)
|
||||
def work(ctx, push):
|
||||
...
|
||||
"""
|
||||
|
||||
# Copyright (c) PyZMQ Developers.
|
||||
# Distributed under the terms of the Modified BSD License.
|
||||
|
||||
__all__ = (
|
||||
'context',
|
||||
'socket',
|
||||
)
|
||||
|
||||
from functools import wraps
|
||||
|
||||
import zmq
|
||||
from zmq.utils.strtypes import basestring
|
||||
|
||||
|
||||
class _Decorator(object):
|
||||
'''The mini decorator factory'''
|
||||
|
||||
def __init__(self, target=None):
|
||||
self._target = target
|
||||
|
||||
def __call__(self, *dec_args, **dec_kwargs):
|
||||
'''
|
||||
The main logic of decorator
|
||||
|
||||
Here is how those arguments works::
|
||||
|
||||
@out_decorator(*dec_args, *dec_kwargs)
|
||||
def func(*wrap_args, **wrap_kwargs):
|
||||
...
|
||||
|
||||
And in the ``wrapper``, we simply create ``self.target`` instance via
|
||||
``with``::
|
||||
|
||||
target = self.get_target(*args, **kwargs)
|
||||
with target(*dec_args, **dec_kwargs) as obj:
|
||||
...
|
||||
|
||||
'''
|
||||
kw_name, dec_args, dec_kwargs = self.process_decorator_args(*dec_args, **dec_kwargs)
|
||||
|
||||
def decorator(func):
|
||||
@wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
target = self.get_target(*args, **kwargs)
|
||||
|
||||
with target(*dec_args, **dec_kwargs) as obj:
|
||||
# insert our object into args
|
||||
if kw_name and kw_name not in kwargs:
|
||||
kwargs[kw_name] = obj
|
||||
elif kw_name and kw_name in kwargs:
|
||||
raise TypeError(
|
||||
"{0}() got multiple values for"
|
||||
" argument '{1}'".format(
|
||||
func.__name__, kw_name))
|
||||
else:
|
||||
args = args + (obj,)
|
||||
|
||||
return func(*args, **kwargs)
|
||||
|
||||
return wrapper
|
||||
|
||||
return decorator
|
||||
|
||||
def get_target(self, *args, **kwargs):
|
||||
"""Return the target function
|
||||
|
||||
Allows modifying args/kwargs to be passed.
|
||||
"""
|
||||
return self._target
|
||||
|
||||
def process_decorator_args(self, *args, **kwargs):
|
||||
"""Process args passed to the decorator.
|
||||
|
||||
args not consumed by the decorator will be passed to the target factory
|
||||
(Context/Socket constructor).
|
||||
"""
|
||||
kw_name = None
|
||||
|
||||
if isinstance(kwargs.get('name'), basestring):
|
||||
kw_name = kwargs.pop('name')
|
||||
elif len(args) >= 1 and isinstance(args[0], basestring):
|
||||
kw_name = args[0]
|
||||
args = args[1:]
|
||||
|
||||
return kw_name, args, kwargs
|
||||
|
||||
|
||||
class _ContextDecorator(_Decorator):
|
||||
"""Decorator subclass for Contexts"""
|
||||
def __init__(self):
|
||||
super(_ContextDecorator, self).__init__(zmq.Context)
|
||||
|
||||
|
||||
class _SocketDecorator(_Decorator):
|
||||
"""Decorator subclass for sockets
|
||||
|
||||
Gets the context from other args.
|
||||
"""
|
||||
|
||||
def process_decorator_args(self, *args, **kwargs):
|
||||
"""Also grab context_name out of kwargs"""
|
||||
kw_name, args, kwargs = super(_SocketDecorator, self).process_decorator_args(*args, **kwargs)
|
||||
self.context_name = kwargs.pop('context_name', 'context')
|
||||
return kw_name, args, kwargs
|
||||
|
||||
def get_target(self, *args, **kwargs):
|
||||
"""Get context, based on call-time args"""
|
||||
context = self._get_context(*args, **kwargs)
|
||||
return context.socket
|
||||
|
||||
def _get_context(self, *args, **kwargs):
|
||||
'''
|
||||
Find the ``zmq.Context`` from ``args`` and ``kwargs`` at call time.
|
||||
|
||||
First, if there is an keyword argument named ``context`` and it is a
|
||||
``zmq.Context`` instance , we will take it.
|
||||
|
||||
Second, we check all the ``args``, take the first ``zmq.Context``
|
||||
instance.
|
||||
|
||||
Finally, we will provide default Context -- ``zmq.Context.instance``
|
||||
|
||||
:return: a ``zmq.Context`` instance
|
||||
'''
|
||||
if self.context_name in kwargs:
|
||||
ctx = kwargs[self.context_name]
|
||||
|
||||
if isinstance(ctx, zmq.Context):
|
||||
return ctx
|
||||
|
||||
for arg in args:
|
||||
if isinstance(arg, zmq.Context):
|
||||
return arg
|
||||
# not specified by any decorator
|
||||
return zmq.Context.instance()
|
||||
|
||||
|
||||
def context(*args, **kwargs):
|
||||
'''Decorator for adding a Context to a function.
|
||||
|
||||
Usage::
|
||||
|
||||
@context()
|
||||
def foo(ctx):
|
||||
...
|
||||
|
||||
.. versionadded:: 15.3
|
||||
|
||||
:param str name: the keyword argument passed to decorated function
|
||||
'''
|
||||
return _ContextDecorator()(*args, **kwargs)
|
||||
|
||||
|
||||
def socket(*args, **kwargs):
|
||||
'''Decorator for adding a socket to a function.
|
||||
|
||||
Usage::
|
||||
|
||||
@socket(zmq.PUSH)
|
||||
def foo(push):
|
||||
...
|
||||
|
||||
.. versionadded:: 15.3
|
||||
|
||||
:param str name: the keyword argument passed to decorated function
|
||||
:param str context_name: the keyword only argument to identify context
|
||||
object
|
||||
'''
|
||||
return _SocketDecorator()(*args, **kwargs)
|
||||
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue