2828import io
2929import keyword
3030import pydoc
31+ from collections import namedtuple
3132from six .moves import range
3233
3334from pygments .token import Token
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
4450class 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
176182def 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
253257def is_eval_safe_name (string ):
0 commit comments