Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/boltons/namedutils.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/boltons/namedutils.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,369 +0,0 @@ -# -*- coding: utf-8 -*- -"""\ -The ``namedutils`` module defines two lightweight container types: -:class:`namedtuple` and :class:`namedlist`. Both are subtypes of built-in -sequence types, which are very fast and efficient. They simply add -named attribute accessors for specific indexes within themselves. - -The :class:`namedtuple` is identical to the built-in -:class:`collections.namedtuple`, with a couple of enhancements, -including a ``__repr__`` more suitable to inheritance. - -The :class:`namedlist` is the mutable counterpart to the -:class:`namedtuple`, and is much faster and lighter-weight than -full-blown :class:`object`. Consider this if you're implementing nodes -in a tree, graph, or other mutable data structure. If you want an even -skinnier approach, you'll probably have to look to C. -""" - -from __future__ import print_function - -import sys as _sys -try: - from collections import OrderedDict -except ImportError: - # backwards compatibility (2.6 has no OrderedDict) - OrderedDict = dict -from keyword import iskeyword as _iskeyword -from operator import itemgetter as _itemgetter - -try: - basestring - def exec_(code, global_env): - exec("exec code in global_env") -except NameError: - basestring = (str, bytes) # Python 3 compat - def exec_(code, global_env): - exec(code, global_env) - -__all__ = ['namedlist', 'namedtuple'] - -# Tiny templates - -_repr_tmpl = '{name}=%r' - -_imm_field_tmpl = '''\ - {name} = _property(_itemgetter({index:d}), doc='Alias for field {index:d}') -''' - -_m_field_tmpl = '''\ - {name} = _property(_itemgetter({index:d}), _itemsetter({index:d}), doc='Alias for field {index:d}') -''' - -################################################################# -### namedtuple -################################################################# - -_namedtuple_tmpl = '''\ -class {typename}(tuple): - '{typename}({arg_list})' - - __slots__ = () - - _fields = {field_names!r} - - def __new__(_cls, {arg_list}): # TODO: tweak sig to make more extensible - 'Create new instance of {typename}({arg_list})' - return _tuple.__new__(_cls, ({arg_list})) - - @classmethod - def _make(cls, iterable, new=_tuple.__new__, len=len): - 'Make a new {typename} object from a sequence or iterable' - result = new(cls, iterable) - if len(result) != {num_fields:d}: - raise TypeError('Expected {num_fields:d}' - ' arguments, got %d' % len(result)) - return result - - def __repr__(self): - 'Return a nicely formatted representation string' - tmpl = self.__class__.__name__ + '({repr_fmt})' - return tmpl % self - - def _asdict(self): - 'Return a new OrderedDict which maps field names to their values' - return OrderedDict(zip(self._fields, self)) - - def _replace(_self, **kwds): - 'Return a new {typename} object replacing field(s) with new values' - result = _self._make(map(kwds.pop, {field_names!r}, _self)) - if kwds: - raise ValueError('Got unexpected field names: %r' % kwds.keys()) - return result - - def __getnewargs__(self): - 'Return self as a plain tuple. Used by copy and pickle.' - return tuple(self) - - __dict__ = _property(_asdict) - - def __getstate__(self): - 'Exclude the OrderedDict from pickling' # wat - pass - -{field_defs} -''' - -def namedtuple(typename, field_names, verbose=False, rename=False): - """Returns a new subclass of tuple with named fields. - - >>> Point = namedtuple('Point', ['x', 'y']) - >>> Point.__doc__ # docstring for the new class - 'Point(x, y)' - >>> p = Point(11, y=22) # instantiate with pos args or keywords - >>> p[0] + p[1] # indexable like a plain tuple - 33 - >>> x, y = p # unpack like a regular tuple - >>> x, y - (11, 22) - >>> p.x + p.y # fields also accessible by name - 33 - >>> d = p._asdict() # convert to a dictionary - >>> d['x'] - 11 - >>> Point(**d) # convert from a dictionary - Point(x=11, y=22) - >>> p._replace(x=100) # _replace() is like str.replace() but targets named fields - Point(x=100, y=22) - """ - - # Validate the field names. At the user's option, either generate an error - # message or automatically replace the field name with a valid name. - if isinstance(field_names, basestring): - field_names = field_names.replace(',', ' ').split() - field_names = [str(x) for x in field_names] - if rename: - seen = set() - for index, name in enumerate(field_names): - if (not all(c.isalnum() or c == '_' for c in name) - or _iskeyword(name) - or not name - or name[0].isdigit() - or name.startswith('_') - or name in seen): - field_names[index] = '_%d' % index - seen.add(name) - for name in [typename] + field_names: - if not all(c.isalnum() or c == '_' for c in name): - raise ValueError('Type names and field names can only contain ' - 'alphanumeric characters and underscores: %r' - % name) - if _iskeyword(name): - raise ValueError('Type names and field names cannot be a ' - 'keyword: %r' % name) - if name[0].isdigit(): - raise ValueError('Type names and field names cannot start with ' - 'a number: %r' % name) - seen = set() - for name in field_names: - if name.startswith('_') and not rename: - raise ValueError('Field names cannot start with an underscore: ' - '%r' % name) - if name in seen: - raise ValueError('Encountered duplicate field name: %r' % name) - seen.add(name) - - # Fill-in the class template - fmt_kw = {'typename': typename} - fmt_kw['field_names'] = tuple(field_names) - fmt_kw['num_fields'] = len(field_names) - fmt_kw['arg_list'] = repr(tuple(field_names)).replace("'", "")[1:-1] - fmt_kw['repr_fmt'] = ', '.join(_repr_tmpl.format(name=name) - for name in field_names) - fmt_kw['field_defs'] = '\n'.join(_imm_field_tmpl.format(index=index, name=name) - for index, name in enumerate(field_names)) - class_definition = _namedtuple_tmpl.format(**fmt_kw) - - if verbose: - print(class_definition) - - # Execute the template string in a temporary namespace and support - # tracing utilities by setting a value for frame.f_globals['__name__'] - namespace = dict(_itemgetter=_itemgetter, - __name__='namedtuple_%s' % typename, - OrderedDict=OrderedDict, - _property=property, - _tuple=tuple) - try: - exec_(class_definition, namespace) - except SyntaxError as e: - raise SyntaxError(e.message + ':\n' + class_definition) - result = namespace[typename] - - # For pickling to work, the __module__ variable needs to be set to the frame - # where the named tuple is created. Bypass this step in environments where - # sys._getframe is not defined (Jython for example) or sys._getframe is not - # defined for arguments greater than 0 (IronPython). - try: - frame = _sys._getframe(1) - result.__module__ = frame.f_globals.get('__name__', '__main__') - except (AttributeError, ValueError): - pass - - return result - - -################################################################# -### namedlist -################################################################# - -_namedlist_tmpl = '''\ -class {typename}(list): - '{typename}({arg_list})' - - __slots__ = () - - _fields = {field_names!r} - - def __new__(_cls, {arg_list}): # TODO: tweak sig to make more extensible - 'Create new instance of {typename}({arg_list})' - return _list.__new__(_cls, ({arg_list})) - - def __init__(self, {arg_list}): # tuple didn't need this but list does - return _list.__init__(self, ({arg_list})) - - @classmethod - def _make(cls, iterable, new=_list, len=len): - 'Make a new {typename} object from a sequence or iterable' - # why did this function exist? why not just star the - # iterable like below? - result = cls(*iterable) - if len(result) != {num_fields:d}: - raise TypeError('Expected {num_fields:d} arguments,' - ' got %d' % len(result)) - return result - - def __repr__(self): - 'Return a nicely formatted representation string' - tmpl = self.__class__.__name__ + '({repr_fmt})' - return tmpl % tuple(self) - - def _asdict(self): - 'Return a new OrderedDict which maps field names to their values' - return OrderedDict(zip(self._fields, self)) - - def _replace(_self, **kwds): - 'Return a new {typename} object replacing field(s) with new values' - result = _self._make(map(kwds.pop, {field_names!r}, _self)) - if kwds: - raise ValueError('Got unexpected field names: %r' % kwds.keys()) - return result - - def __getnewargs__(self): - 'Return self as a plain list. Used by copy and pickle.' - return tuple(self) - - __dict__ = _property(_asdict) - - def __getstate__(self): - 'Exclude the OrderedDict from pickling' # wat - pass - -{field_defs} -''' - - -def namedlist(typename, field_names, verbose=False, rename=False): - """Returns a new subclass of list with named fields. - - >>> Point = namedlist('Point', ['x', 'y']) - >>> Point.__doc__ # docstring for the new class - 'Point(x, y)' - >>> p = Point(11, y=22) # instantiate with pos args or keywords - >>> p[0] + p[1] # indexable like a plain list - 33 - >>> x, y = p # unpack like a regular list - >>> x, y - (11, 22) - >>> p.x + p.y # fields also accessible by name - 33 - >>> d = p._asdict() # convert to a dictionary - >>> d['x'] - 11 - >>> Point(**d) # convert from a dictionary - Point(x=11, y=22) - >>> p._replace(x=100) # _replace() is like str.replace() but targets named fields - Point(x=100, y=22) - """ - - # Validate the field names. At the user's option, either generate an error - # message or automatically replace the field name with a valid name. - if isinstance(field_names, basestring): - field_names = field_names.replace(',', ' ').split() - field_names = [str(x) for x in field_names] - if rename: - seen = set() - for index, name in enumerate(field_names): - if (not all(c.isalnum() or c == '_' for c in name) - or _iskeyword(name) - or not name - or name[0].isdigit() - or name.startswith('_') - or name in seen): - field_names[index] = '_%d' % index - seen.add(name) - for name in [typename] + field_names: - if not all(c.isalnum() or c == '_' for c in name): - raise ValueError('Type names and field names can only contain ' - 'alphanumeric characters and underscores: %r' - % name) - if _iskeyword(name): - raise ValueError('Type names and field names cannot be a ' - 'keyword: %r' % name) - if name[0].isdigit(): - raise ValueError('Type names and field names cannot start with ' - 'a number: %r' % name) - seen = set() - for name in field_names: - if name.startswith('_') and not rename: - raise ValueError('Field names cannot start with an underscore: ' - '%r' % name) - if name in seen: - raise ValueError('Encountered duplicate field name: %r' % name) - seen.add(name) - - # Fill-in the class template - fmt_kw = {'typename': typename} - fmt_kw['field_names'] = tuple(field_names) - fmt_kw['num_fields'] = len(field_names) - fmt_kw['arg_list'] = repr(tuple(field_names)).replace("'", "")[1:-1] - fmt_kw['repr_fmt'] = ', '.join(_repr_tmpl.format(name=name) - for name in field_names) - fmt_kw['field_defs'] = '\n'.join(_m_field_tmpl.format(index=index, name=name) - for index, name in enumerate(field_names)) - class_definition = _namedlist_tmpl.format(**fmt_kw) - - if verbose: - print(class_definition) - - def _itemsetter(key): - def _itemsetter(obj, value): - obj[key] = value - return _itemsetter - - # Execute the template string in a temporary namespace and support - # tracing utilities by setting a value for frame.f_globals['__name__'] - namespace = dict(_itemgetter=_itemgetter, - _itemsetter=_itemsetter, - __name__='namedlist_%s' % typename, - OrderedDict=OrderedDict, - _property=property, - _list=list) - try: - exec_(class_definition, namespace) - except SyntaxError as e: - raise SyntaxError(e.message + ':\n' + class_definition) - result = namespace[typename] - - # For pickling to work, the __module__ variable needs to be set to - # the frame where the named list is created. Bypass this step in - # environments where sys._getframe is not defined (Jython for - # example) or sys._getframe is not defined for arguments greater - # than 0 (IronPython). - try: - frame = _sys._getframe(1) - result.__module__ = frame.f_globals.get('__name__', '__main__') - except (AttributeError, ValueError): - pass - - return result