Skip to content

Commit ab3ed09

Browse files
committed
argspec replaced with named tuples for better readability
1 parent 66d7b52 commit ab3ed09

File tree

1 file changed

+26
-22
lines changed

1 file changed

+26
-22
lines changed

bpython/inspection.py

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import io
2929
import keyword
3030
import pydoc
31+
from collections import namedtuple
3132
from six.moves import range
3233

3334
from pygments.token import Token
@@ -40,6 +41,11 @@
4041

4142
_name = LazyReCompile(r'[a-zA-Z_]\w*$')
4243

44+
Argspec = namedtuple('Argspec', ['args', 'varargs', 'varkwargs', 'defaults',
45+
'kwonly', 'kwonly_defaults', 'annotations'])
46+
47+
FuncProps = namedtuple('FuncProps', ['func', 'argspec', 'is_bound_method'])
48+
4349

4450
class AttrCleaner(object):
4551
"""A context manager that tries to make an object not exhibit side-effects
@@ -175,44 +181,39 @@ def fixlongargs(f, argspec):
175181

176182
def getpydocspec(f, func):
177183
try:
178-
argspec = pydoc.getdoc(f)
184+
docstring = pydoc.getdoc(f)
179185
except NameError:
180186
return None
181-
182-
s = getpydocspec_re.search(argspec)
187+
s = getpydocspec_re.search(docstring)
183188
if s is None:
184189
return None
185190

186191
if not hasattr(f, '__name__') or s.groups()[0] != f.__name__:
187192
return None
188193

189-
args = list()
190-
defaults = list()
191-
varargs = varkwargs = None
192-
kwonly_args = list()
193-
kwonly_defaults = dict()
194+
argspec = Argspec(list(), None, None, list(), list(), dict(), None)
195+
194196
for arg in s.group(2).split(','):
195197
arg = arg.strip()
196198
if arg.startswith('**'):
197-
varkwargs = arg[2:]
199+
argspec.varkwargs = arg[2:]
198200
elif arg.startswith('*'):
199-
varargs = arg[1:]
201+
argspec.varargs = arg[1:]
200202
else:
201203
arg, _, default = arg.partition('=')
202-
if varargs is not None:
203-
kwonly_args.append(arg)
204+
if argspec.varargs is not None:
205+
argspec.kwonly_args.append(arg)
204206
if default:
205-
kwonly_defaults[arg] = default
207+
argspec.kwonly_defaults[arg] = default
206208
else:
207-
args.append(arg)
209+
argspec.args.append(arg)
208210
if default:
209-
defaults.append(default)
211+
argspec.defaults.append(default)
210212

211-
return [func, (args, varargs, varkwargs, defaults,
212-
kwonly_args, kwonly_defaults)]
213+
return argspec
213214

214215

215-
def getargspec(func, f):
216+
def getfuncprops(func, f):
216217
# Check if it's a real bound method or if it's implicitly calling __init__
217218
# (i.e. FooClass(...) and not FooClass.__init__(...) -- the former would
218219
# not take 'self', the latter would:
@@ -238,16 +239,19 @@ def getargspec(func, f):
238239

239240
argspec = list(argspec)
240241
fixlongargs(f, argspec)
241-
argspec = [func, argspec, is_bound_method]
242+
if len(argspec) == 4:
243+
argspec = argspec + [list(),dict(),None]
244+
argspec = Argspec(*argspec)
245+
fprops = FuncProps(func, argspec, is_bound_method)
242246
except (TypeError, KeyError):
243247
with AttrCleaner(f):
244248
argspec = getpydocspec(f, func)
245249
if argspec is None:
246250
return None
247251
if inspect.ismethoddescriptor(f):
248-
argspec[1][0].insert(0, 'obj')
249-
argspec.append(is_bound_method)
250-
return argspec
252+
argspec.args.insert(0, 'obj')
253+
fprops = FuncProps(func, argspec, is_bound_method)
254+
return fprops
251255

252256

253257
def is_eval_safe_name(string):

0 commit comments

Comments
 (0)