summaryrefslogtreecommitdiff
path: root/src/decorator.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/decorator.py')
-rw-r--r--src/decorator.py39
1 files changed, 17 insertions, 22 deletions
diff --git a/src/decorator.py b/src/decorator.py
index 09a466e..6362c02 100644
--- a/src/decorator.py
+++ b/src/decorator.py
@@ -1,6 +1,6 @@
# ######################### LICENSE ############################ #
-# Copyright (c) 2005-2016, Michele Simionato
+# Copyright (c) 2005-2017, Michele Simionato
# All rights reserved.
# Redistribution and use in source and binary forms, with or without
@@ -40,7 +40,7 @@ import operator
import itertools
import collections
-__version__ = '4.0.10'
+__version__ = '4.0.11'
if sys.version >= '3':
from inspect import getfullargspec
@@ -48,21 +48,13 @@ if sys.version >= '3':
def get_init(cls):
return cls.__init__
else:
- class getfullargspec(object):
- "A quick and dirty replacement for getfullargspec for Python 2.X"
- def __init__(self, f):
- self.args, self.varargs, self.varkw, self.defaults = \
- inspect.getargspec(f)
- self.kwonlyargs = []
- self.kwonlydefaults = None
-
- def __iter__(self):
- yield self.args
- yield self.varargs
- yield self.varkw
- yield self.defaults
+ FullArgSpec = collections.namedtuple(
+ 'FullArgSpec', 'args varargs varkw defaults '
+ 'kwonlyargs kwonlydefaults')
- getargspec = inspect.getargspec
+ def getfullargspec(f):
+ "A quick and dirty replacement for getfullargspec for Python 2.X"
+ return FullArgSpec._make(inspect.getargspec(f) + ([], None))
def get_init(cls):
return cls.__init__.__func__
@@ -78,7 +70,7 @@ def getargspec(f):
return ArgSpec(spec.args, spec.varargs, spec.varkw, spec.defaults)
-DEF = re.compile('\s*def\s*([_\w][_\w\d]*)\s*\(')
+DEF = re.compile(r'\s*def\s*([_\w][_\w\d]*)\s*\(')
# basic functionality
@@ -92,6 +84,9 @@ class FunctionMaker(object):
# Atomic get-and-increment provided by the GIL
_compile_count = itertools.count()
+ # make pylint happy
+ args = varargs = varkw = defaults = kwonlyargs = kwonlydefaults = ()
+
def __init__(self, func=None, name=None, signature=None,
defaults=None, doc=None, module=None, funcdict=None):
self.shortsignature = signature
@@ -154,8 +149,8 @@ class FunctionMaker(object):
func.__name__ = self.name
func.__doc__ = getattr(self, 'doc', None)
func.__dict__ = getattr(self, 'dict', {})
- func.__defaults__ = getattr(self, 'defaults', ())
- func.__kwdefaults__ = getattr(self, 'kwonlydefaults', None)
+ func.__defaults__ = self.defaults
+ func.__kwdefaults__ = self.kwonlydefaults or None
func.__annotations__ = getattr(self, 'annotations', None)
try:
frame = sys._getframe(3)
@@ -346,7 +341,7 @@ def dispatch_on(*dispatch_args):
ras = [[] for _ in range(len(dispatch_args))]
for types_ in typemap:
for t, type_, ra in zip(types, types_, ras):
- if issubclass(t, type_) and type_ not in t.__mro__:
+ if issubclass(t, type_) and type_ not in t.mro():
append(type_, ra)
return [set(ra) for ra in ras]
@@ -363,9 +358,9 @@ def dispatch_on(*dispatch_args):
'Ambiguous dispatch for %s: %s' % (t, vas))
elif n_vas == 1:
va, = vas
- mro = type('t', (t, va), {}).__mro__[1:]
+ mro = type('t', (t, va), {}).mro()[1:]
else:
- mro = t.__mro__
+ mro = t.mro()
lists.append(mro[:-1]) # discard t and object
return lists