-
Notifications
You must be signed in to change notification settings - Fork 246
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'upstream'
- Loading branch information
Showing
6 changed files
with
121 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
CMSSW_5_3_X |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
"""functools.py - Tools for working with functions and callable objects | ||
""" | ||
# Python module wrapper for _functools C module | ||
# to allow utilities written in Python to be added | ||
# to the functools module. | ||
# Written by Nick Coghlan <ncoghlan at gmail.com> | ||
# Copyright (C) 2006 Python Software Foundation. | ||
# See C source code for _functools credits/copyright | ||
|
||
from _functools import partial, reduce | ||
|
||
# update_wrapper() and wraps() are tools to help write | ||
# wrapper functions that can handle naive introspection | ||
|
||
WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__') | ||
WRAPPER_UPDATES = ('__dict__',) | ||
def update_wrapper(wrapper, | ||
wrapped, | ||
assigned = WRAPPER_ASSIGNMENTS, | ||
updated = WRAPPER_UPDATES): | ||
"""Update a wrapper function to look like the wrapped function | ||
wrapper is the function to be updated | ||
wrapped is the original function | ||
assigned is a tuple naming the attributes assigned directly | ||
from the wrapped function to the wrapper function (defaults to | ||
functools.WRAPPER_ASSIGNMENTS) | ||
updated is a tuple naming the attributes of the wrapper that | ||
are updated with the corresponding attribute from the wrapped | ||
function (defaults to functools.WRAPPER_UPDATES) | ||
""" | ||
for attr in assigned: | ||
setattr(wrapper, attr, getattr(wrapped, attr)) | ||
for attr in updated: | ||
getattr(wrapper, attr).update(getattr(wrapped, attr, {})) | ||
# Return the wrapper so this can be used as a decorator via partial() | ||
return wrapper | ||
|
||
def wraps(wrapped, | ||
assigned = WRAPPER_ASSIGNMENTS, | ||
updated = WRAPPER_UPDATES): | ||
"""Decorator factory to apply update_wrapper() to a wrapper function | ||
Returns a decorator that invokes update_wrapper() with the decorated | ||
function as the wrapper argument and the arguments to wraps() as the | ||
remaining arguments. Default arguments are as for update_wrapper(). | ||
This is a convenience function to simplify applying partial() to | ||
update_wrapper(). | ||
""" | ||
return partial(update_wrapper, wrapped=wrapped, | ||
assigned=assigned, updated=updated) | ||
|
||
def total_ordering(cls): | ||
"""Class decorator that fills in missing ordering methods""" | ||
convert = { | ||
'__lt__': [('__gt__', lambda self, other: not (self < other or self == other)), | ||
('__le__', lambda self, other: self < other or self == other), | ||
('__ge__', lambda self, other: not self < other)], | ||
'__le__': [('__ge__', lambda self, other: not self <= other or self == other), | ||
('__lt__', lambda self, other: self <= other and not self == other), | ||
('__gt__', lambda self, other: not self <= other)], | ||
'__gt__': [('__lt__', lambda self, other: not (self > other or self == other)), | ||
('__ge__', lambda self, other: self > other or self == other), | ||
('__le__', lambda self, other: not self > other)], | ||
'__ge__': [('__le__', lambda self, other: (not self >= other) or self == other), | ||
('__gt__', lambda self, other: self >= other and not self == other), | ||
('__lt__', lambda self, other: not self >= other)] | ||
} | ||
roots = set(dir(cls)) & set(convert) | ||
if not roots: | ||
raise ValueError('must define at least one ordering operation: < > <= >=') | ||
root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__ | ||
for opname, opfunc in convert[root]: | ||
if opname not in roots: | ||
opfunc.__name__ = opname | ||
opfunc.__doc__ = getattr(int, opname).__doc__ | ||
setattr(cls, opname, opfunc) | ||
return cls | ||
|
||
def cmp_to_key(mycmp): | ||
"""Convert a cmp= function into a key= function""" | ||
class K(object): | ||
__slots__ = ['obj'] | ||
def __init__(self, obj, *args): | ||
self.obj = obj | ||
def __lt__(self, other): | ||
return mycmp(self.obj, other.obj) < 0 | ||
def __gt__(self, other): | ||
return mycmp(self.obj, other.obj) > 0 | ||
def __eq__(self, other): | ||
return mycmp(self.obj, other.obj) == 0 | ||
def __le__(self, other): | ||
return mycmp(self.obj, other.obj) <= 0 | ||
def __ge__(self, other): | ||
return mycmp(self.obj, other.obj) >= 0 | ||
def __ne__(self, other): | ||
return mycmp(self.obj, other.obj) != 0 | ||
def __hash__(self): | ||
raise TypeError('hash not implemented') | ||
return K |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters