summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hellkamp <marc@gsites.de>2015-11-28 11:03:01 +0100
committerMarcel Hellkamp <marc@gsites.de>2015-11-28 11:03:01 +0100
commit49fcac90745c6528a7cfff25ed5ee7bc462ddbe4 (patch)
treec1142d97caa2f4c3c081929ecae3ee99bcfbcb61
parentd0eb91ef4484d1e640fbea703717cb2069dcc5b6 (diff)
downloadbottle-49fcac90745c6528a7cfff25ed5ee7bc462ddbe4.tar.gz
Added inspection support for func(a, *, b) signature types.
-rw-r--r--bottle.py11
-rw-r--r--test/test_route.py7
2 files changed, 16 insertions, 2 deletions
diff --git a/bottle.py b/bottle.py
index 2e8b551..ec7a7f9 100644
--- a/bottle.py
+++ b/bottle.py
@@ -94,8 +94,15 @@ try:
defaults.append(param.default)
return (args, varargs, keywords, tuple(defaults) or None)
except ImportError:
- from inspect import getargspec
-
+ try:
+ from inspect import getfullargspec
+ def getargspec(func):
+ spec = getfullargspec(func)
+ kwargs = makelist(spec[0]) + makelist(spec.kwonlyargs)
+ return kwargs, spec[1], spec[2], spec[3]
+ except ImportError:
+ from inspect import getargspec
+
try:
from simplejson import dumps as json_dumps, loads as json_lds
except ImportError: # pragma: no cover
diff --git a/test/test_route.py b/test/test_route.py
index 237d3c7..ba0a06a 100644
--- a/test/test_route.py
+++ b/test/test_route.py
@@ -48,3 +48,10 @@ class TestRoute(unittest.TestCase):
# triggers the "TypeError: 'foo' is not a Python function"
self.assertEqual(set(route.get_callback_args()), set(['a', 'b']))
+
+ if bottle.py3k:
+ def test_callback_inspection_newsig(self):
+ env = {}
+ eval(compile('def foo(a, *, b=5): pass', '<foo>', 'exec'), env, env)
+ route = bottle.Route(None, None, None, env['foo'])
+ self.assertEqual(set(route.get_callback_args()), set(['a', 'b']))