⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utils.py

📁 LINUX下
💻 PY
📖 第 1 页 / 共 2 页
字号:
    res = []    for (key, value) in dictionary.iteritems():        if element is value:            res.append(key)    return resdef dictincr(dictionary, element):    """    Increments `element` in `dictionary`,     setting it to one if it doesn't exist.            >>> d = {1:2, 3:4}        >>> dictincr(d, 1)        3        >>> d[1]        3        >>> dictincr(d, 5)        1        >>> d[5]        1    """    dictionary.setdefault(element, 0)    dictionary[element] += 1    return dictionary[element]def dictadd(*dicts):    """    Returns a dictionary consisting of the keys in the argument dictionaries.    If they share a key, the value from the last argument is used.            >>> dictadd({1: 0, 2: 0}, {2: 1, 3: 1})        {1: 0, 2: 1, 3: 1}    """    result = {}    for dct in dicts:        result.update(dct)    return resultdef listget(lst, ind, default=None):    """    Returns `lst[ind]` if it exists, `default` otherwise.            >>> listget(['a'], 0)        'a'        >>> listget(['a'], 1)        >>> listget(['a'], 1, 'b')        'b'    """    if len(lst)-1 < ind:         return default    return lst[ind]def intget(integer, default=None):    """    Returns `integer` as an int or `default` if it can't.            >>> intget('3')        3        >>> intget('3a')        >>> intget('3a', 0)        0    """    try:        return int(integer)    except (TypeError, ValueError):        return defaultdef datestr(then, now=None):    """    Converts a (UTC) datetime object to a nice string representation.            >>> from datetime import datetime, timedelta        >>> d = datetime(1970, 5, 1)        >>> datestr(d, now=d)        '0 microseconds ago'        >>> for t, v in {        ...   timedelta(microseconds=1): '1 microsecond ago',        ...   timedelta(microseconds=2): '2 microseconds ago',        ...   -timedelta(microseconds=1): '1 microsecond from now',        ...   -timedelta(microseconds=2): '2 microseconds from now',        ...   timedelta(microseconds=2000): '2 milliseconds ago',        ...   timedelta(seconds=2): '2 seconds ago',        ...   timedelta(seconds=2*60): '2 minutes ago',        ...   timedelta(seconds=2*60*60): '2 hours ago',        ...   timedelta(days=2): '2 days ago',        ... }.iteritems():        ...     assert datestr(d, now=d+t) == v        >>> datestr(datetime(1970, 1, 1), now=d)        'January  1'        >>> datestr(datetime(1969, 1, 1), now=d)        'January  1, 1969'        >>> datestr(datetime(1970, 6, 1), now=d)        'June  1, 1970'    """    def agohence(n, what, divisor=None):        if divisor: n = n // divisor        out = str(abs(n)) + ' ' + what       # '2 day'        if abs(n) != 1: out += 's'           # '2 days'        out += ' '                           # '2 days '        if n < 0:            out += 'from now'        else:            out += 'ago'        return out                           # '2 days ago'    oneday = 24 * 60 * 60    if not now: now = datetime.datetime.utcnow()    if type(now).__name__ == "DateTime":        now = datetime.datetime.fromtimestamp(now)    if type(then).__name__ == "DateTime":        then = datetime.datetime.fromtimestamp(then)    delta = now - then    deltaseconds = int(delta.days * oneday + delta.seconds + delta.microseconds * 1e-06)    deltadays = abs(deltaseconds) // oneday    if deltaseconds < 0: deltadays *= -1 # fix for oddity of floor    if deltadays:        if abs(deltadays) < 4:            return agohence(deltadays, 'day')        out = then.strftime('%B %e') # e.g. 'June 13'        if then.year != now.year or deltadays < 0:            out += ', %s' % then.year        return out    if int(deltaseconds):        if abs(deltaseconds) > (60 * 60):            return agohence(deltaseconds, 'hour', 60 * 60)        elif abs(deltaseconds) > 60:            return agohence(deltaseconds, 'minute', 60)        else:            return agohence(deltaseconds, 'second')    deltamicroseconds = delta.microseconds    if delta.days: deltamicroseconds = int(delta.microseconds - 1e6) # datetime oddity    if abs(deltamicroseconds) > 1000:        return agohence(deltamicroseconds, 'millisecond', 1000)    return agohence(deltamicroseconds, 'microsecond')def numify(string):    """    Removes all non-digit characters from `string`.            >>> numify('800-555-1212')        '8005551212'        >>> numify('800.555.1212')        '8005551212'        """    return ''.join([c for c in str(string) if c.isdigit()])def denumify(string, pattern):    """    Formats `string` according to `pattern`, where the letter X gets replaced    by characters from `string`.            >>> denumify("8005551212", "(XXX) XXX-XXXX")        '(800) 555-1212'        """    out = []    for c in pattern:        if c == "X":            out.append(string[0])            string = string[1:]        else:            out.append(c)    return ''.join(out)def dateify(datestring):    """    Formats a numified `datestring` properly.    """    return denumify(datestring, "XXXX-XX-XX XX:XX:XX")class CaptureStdout:    """    Captures everything `func` prints to stdout and returns it instead.            >>> def idiot():        ...     print "foo"        >>> capturestdout(idiot)()        'foo\\n'        **WARNING:** Not threadsafe!    """    def __init__(self, func):         self.func = func    def __call__(self, *args, **keywords):        from cStringIO import StringIO        # Not threadsafe!        out = StringIO()        oldstdout = sys.stdout        sys.stdout = out        try:             self.func(*args, **keywords)        finally:             sys.stdout = oldstdout        return out.getvalue()capturestdout = CaptureStdoutclass Profile:    """    Profiles `func` and returns a tuple containing its output    and a string with human-readable profiling information.                >>> import time        >>> out, inf = profile(time.sleep)(.001)        >>> out        >>> inf[:10].strip()        'took 0.0'    """    def __init__(self, func):         self.func = func    def __call__(self, *args): ##, **kw):   kw unused        import hotshot, hotshot.stats, tempfile ##, time already imported        temp = tempfile.NamedTemporaryFile()        prof = hotshot.Profile(temp.name)        stime = time.time()        result = prof.runcall(self.func, *args)        stime = time.time() - stime        prof.close()        stats = hotshot.stats.load(temp.name)        stats.strip_dirs()        stats.sort_stats('time', 'calls')        x =  '\n\ntook '+ str(stime) + ' seconds\n'        x += capturestdout(stats.print_stats)(40)        x += capturestdout(stats.print_callers)()        return result, xprofile = Profileimport traceback# hack for compatibility with Python 2.3:if not hasattr(traceback, 'format_exc'):    from cStringIO import StringIO    def format_exc(limit=None):        strbuf = StringIO()        traceback.print_exc(limit, strbuf)        return strbuf.getvalue()    traceback.format_exc = format_excdef tryall(context, prefix=None):    """    Tries a series of functions and prints their results.     `context` is a dictionary mapping names to values;     the value will only be tried if it's callable.            >>> tryall(dict(j=lambda: True))        j: True        ----------------------------------------        results:           True: 1    For example, you might have a file `test/stuff.py`     with a series of functions testing various things in it.     At the bottom, have a line:        if __name__ == "__main__": tryall(globals())    Then you can run `python test/stuff.py` and get the results of     all the tests.    """    context = context.copy() # vars() would update    results = {}    for (key, value) in context.iteritems():        if not hasattr(value, '__call__'):             continue        if prefix and not key.startswith(prefix):             continue        print key + ':',        try:            r = value()            dictincr(results, r)            print r        except:            print 'ERROR'            dictincr(results, 'ERROR')            print '   ' + '\n   '.join(traceback.format_exc().split('\n'))            print '-'*40    print 'results:'    for (key, value) in results.iteritems():        print ' '*2, str(key)+':', valueclass ThreadedDict:    """    Takes a dictionary that maps threads to objects.     When a thread tries to get or set an attribute or item     of the threadeddict, it passes it on to the object     for that thread in dictionary.    """    def __init__(self, dictionary):         self.__dict__['_ThreadedDict__d'] = dictionary    def __getattr__(self, attr):         return getattr(self.__d[threading.currentThread()], attr)    def __getitem__(self, item):         return self.__d[threading.currentThread()][item]    def __setattr__(self, attr, value):        if attr == '__doc__':            self.__dict__[attr] = value        else:            return setattr(self.__d[threading.currentThread()], attr, value)    def __delattr__(self, item):        try:            del self.__d[threading.currentThread()][item]        except KeyError, k:            raise AttributeError, k    def __delitem__(self, item):        del self.__d[threading.currentThread()][item]    def __setitem__(self, item, value):         self.__d[threading.currentThread()][item] = value    def __hash__(self):         return hash(self.__d[threading.currentThread()])threadeddict = ThreadedDictdef autoassign(self, locals):    """    Automatically assigns local variables to `self`.            >>> self = storage()        >>> autoassign(self, dict(a=1, b=2))        >>> self        <Storage {'a': 1, 'b': 2}>        Generally used in `__init__` methods, as in:        def __init__(self, foo, bar, baz=1): autoassign(self, locals())    """    for (key, value) in locals.iteritems():        if key == 'self':             continue        setattr(self, key, value)def to36(q):    """    Converts an integer to base 36 (a useful scheme for human-sayable IDs).            >>> to36(35)        'z'        >>> to36(119292)        '2k1o'        >>> int(to36(939387374), 36)        939387374        >>> to36(0)        '0'        >>> to36(-393)        Traceback (most recent call last):            ...         ValueError: must supply a positive integer        """    if q < 0: raise ValueError, "must supply a positive integer"    letters = "0123456789abcdefghijklmnopqrstuvwxyz"    converted = []    while q != 0:        q, r = divmod(q, 36)        converted.insert(0, letters[r])    return "".join(converted) or '0'r_url = re_compile('(?<!\()(http://(\S+))')def safemarkdown(text):    """    Converts text to HTML following the rules of Markdown, but blocking any    outside HTML input, so that only the things supported by Markdown    can be used. Also converts raw URLs to links.    (requires [markdown.py](http://webpy.org/markdown.py))    """    from markdown import markdown    if text:        text = text.replace('<', '&lt;')        # TODO: automatically get page title?        text = r_url.sub(r'<\1>', text)        text = markdown(text)        return textif __name__ == "__main__":    import doctest    doctest.testmod()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -