Package mvpa :: Package misc :: Module args

[hide private]
[frames] | no frames]

# Source Code for Module mvpa.misc.args

     1  # emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
     2  # vi: set ft=python sts=4 ts=4 sw=4 et:
     3  ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ##
     4  #
     5  #   See COPYING file distributed along with the PyMVPA package for the
     6  #   copyright and license terms.
     7  #
     8  ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ##
     9  """Helpers for arguments handling."""
    10
    11  __docformat__ = 'restructuredtext'
    12
    13 -def split_kwargs(kwargs, prefixes=[]):
    14      """Helper to separate kwargs into multiple groups
    15
    16      :Parameters:
    17        prefixes : list of basestrings
    18          Each entry sets a prefix which puts entry with key starting
    19          with it into a separate group.
    20          Group '' corresponds to 'leftovers'
    21
    22      :Output:
    23        dictionary with keys == `prefixes`
    24      """
    25      if not ('' in prefixes):
    26          prefixes = prefixes + ['']
    27      result = [ [] for i in prefixes ]
    28      for k,v in kwargs.iteritems():
    29          for i,p in enumerate(prefixes):
    30              if k.startswith(p):
    31                  result[i].append((k.replace(p,'',1), v))
    32                  break
    33      resultd = dict((p,dict(x)) for p,x in zip(prefixes, result))
    34      return resultd
    35
    36
    37 -def group_kwargs(prefixes, assign=False, passthrough=False):
    38      """Decorator function to join parts of kwargs together
    39
    40      :Parameters:
    41        prefixes : list of basestrings
    42          Prefixes to split based on. See `split_kwargs`
    43        assign : bool
    44          Flag to assign the obtained arguments to self._<prefix>_kwargs
    45        passthrough : bool
    46          Flag to pass joined arguments as <prefix>_kwargs argument.
    47          Usually it is sufficient to have either assign or passthrough.
    48          If none of those is True, decorator simply filters out mentioned
    49          groups from being passed to the method
    50
    51      Example: if needed to join all args which start with 'slave<underscore>'
    52      together under slave_kwargs parameter
    53      """
    54      def decorated_method(method):
    55          def do_group_kwargs(self, *args_, **kwargs_):
    56              if '' in prefixes:
    57                  raise ValueError, \
    58                        "Please don't put empty string ('') into prefixes"
    59              # group as needed
    60              splits = split_kwargs(kwargs_, prefixes)
    61              # adjust resultant kwargs__
    62              kwargs__ = splits['']
    63              for prefix in prefixes:
    64                  skwargs = splits[prefix]
    65                  k = '%skwargs' % prefix
    66                  if k in kwargs__:
    67                      # is unprobable but can happen
    68                      raise ValueError, '%s is already given in the arguments' % k
    69                  if passthrough:   kwargs__[k] = skwargs
    70                  if assign: setattr(self, '_%s' % k, skwargs)
    71              return method(self, *args_, **kwargs__)
    72          do_group_kwargs.func_name = method.func_name
    73          return do_group_kwargs
    74
    75      return decorated_method
    76