12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- # -*- coding: utf-8 -*-
- '''stuf base.'''
- import sys
- from functools import partial
- from keyword import iskeyword
- from operator import itemgetter
- from unicodedata import normalize
- from importlib import import_module
- from collections import Sequence, Mapping
- # one frame
- one = lambda a, b: a(b)
- # two frame
- two = lambda a, b, *args: a(b(*args))
- # factory for "is" checkers
- isfactory = lambda x: partial(lambda x, y, z: x(z, y), isinstance, x)
- # next frame up
- getframe = partial(sys._getframe, 1)
- identity = lambda x: x
- dualidentity = lambda x, y: (x, y)
- isnone = lambda x, y: x if y is None else y
- first = itemgetter(0)
- second = itemgetter(1)
- last = itemgetter(-1)
- maporseq = isfactory((Mapping, Sequence))
- ismapping = isfactory(Mapping)
- issequence = isfactory(Sequence)
- norm = partial(normalize, 'NFKD')
- # illegal characters for Python names
- ic = frozenset('()[]{}@,:`=;+*/%&|^><\'"#\\$?!~'.split())
- def backport(*paths):
- '''Go through import `paths` until one imports or everything fails.'''
- load = None
- for path in paths:
- try:
- load = importer(path)
- break
- except ImportError:
- continue
- if load is None:
- raise ImportError('no path')
- return load
- def checkname(name, ic=ic):
- '''Ensures `name` is legal for Python.'''
- # Remove characters that are illegal in a Python name
- name = name.strip().lower().replace('-', '_').replace(
- '.', '_'
- ).replace(' ', '_')
- name = ''.join(i for i in name if i not in ic)
- # add _ if value is Python keyword
- return name + '_' if iskeyword(name) else name
- def coroutine(func):
- '''The Dave Beazley co-routine decorator.'''
- def start(*args, **kw):
- cr = func(*args, **kw)
- cr.next()
- return cr
- return start
- def docit(call, doc):
- '''Add documentation to a callable.'''
- call.__doc__ = doc
- return call
- def importer(path, attribute=None, i=import_module, g=getattr):
- '''Import module `path`, optionally with `attribute`.'''
- try:
- dot = path.rindex('.')
- # import module
- path = g(i(path[:dot]), path[dot + 1:])
- # If nothing but module name, import the module
- except (AttributeError, ValueError):
- path = i(path)
- if attribute:
- path = g(path, attribute)
- return path
|