| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -28,6 +28,7 @@ | |||
| 28 | 28 | import io | |
| 29 | 29 | import keyword | |
| 30 | 30 | import pydoc | |
| 31 | + from collections import namedtuple | ||
| 31 | 32 | from six.moves import range | |
| 32 | 33 | ||
| 33 | 34 | from pygments.token import Token | |
@@ -40,6 +41,11 @@ | |||
| 40 | 41 | ||
| 41 | 42 | _name = LazyReCompile(r'[a-zA-Z_]\w*$') | |
| 42 | 43 | ||
| 44 | + Argspec = namedtuple('Argspec', ['args', 'varargs', 'varkwargs', 'defaults', | ||
| 45 | + 'kwonly', 'kwonly_defaults', 'annotations']) | ||
| 46 | + | ||
| 47 | + FuncProps = namedtuple('FuncProps', ['func', 'argspec', 'is_bound_method']) | ||
| 48 | + | ||
| 43 | 49 | ||
| 44 | 50 | class AttrCleaner(object): | |
| 45 | 51 | """A context manager that tries to make an object not exhibit side-effects | |
@@ -175,44 +181,39 @@ def fixlongargs(f, argspec): | |||
| 175 | 181 | ||
| 176 | 182 | def getpydocspec(f, func): | |
| 177 | 183 | try: | |
| 178 | - argspec = pydoc.getdoc(f) | ||
| 184 | + docstring = pydoc.getdoc(f) | ||
| 179 | 185 | except NameError: | |
| 180 | 186 | return None | |
| 181 | - | ||
| 182 | - s = getpydocspec_re.search(argspec) | ||
| 187 | + s = getpydocspec_re.search(docstring) | ||
| 183 | 188 | if s is None: | |
| 184 | 189 | return None | |
| 185 | 190 | ||
| 186 | 191 | if not hasattr(f, '__name__') or s.groups()[0] != f.__name__: | |
| 187 | 192 | return None | |
| 188 | 193 | ||
| 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 | + | ||
| 194 | 196 | for arg in s.group(2).split(','): | |
| 195 | 197 | arg = arg.strip() | |
| 196 | 198 | if arg.startswith('**'): | |
| 197 | - varkwargs = arg[2:] | ||
| 199 | + argspec.varkwargs = arg[2:] | ||
| 198 | 200 | elif arg.startswith('*'): | |
| 199 | - varargs = arg[1:] | ||
| 201 | + argspec.varargs = arg[1:] | ||
| 200 | 202 | else: | |
| 201 | 203 | 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) | ||
| 204 | 206 | if default: | |
| 205 | - kwonly_defaults[arg] = default | ||
| 207 | + argspec.kwonly_defaults[arg] = default | ||
| 206 | 208 | else: | |
| 207 | - args.append(arg) | ||
| 209 | + argspec.args.append(arg) | ||
| 208 | 210 | if default: | |
| 209 | - defaults.append(default) | ||
| 211 | + argspec.defaults.append(default) | ||
| 210 | 212 | ||
| 211 | - return [func, (args, varargs, varkwargs, defaults, | ||
| 212 | - kwonly_args, kwonly_defaults)] | ||
| 213 | + return argspec | ||
| 213 | 214 | ||
| 214 | 215 | ||
| 215 | - def getargspec(func, f): | ||
| 216 | + def getfuncprops(func, f): | ||
| 216 | 217 | # Check if it's a real bound method or if it's implicitly calling __init__ | |
| 217 | 218 | # (i.e. FooClass(...) and not FooClass.__init__(...) -- the former would | |
| 218 | 219 | # not take 'self', the latter would: | |
@@ -238,16 +239,19 @@ def getargspec(func, f): | |||
| 238 | 239 | ||
| 239 | 240 | argspec = list(argspec) | |
| 240 | 241 | 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) | ||
| 242 | 246 | except (TypeError, KeyError): | |
| 243 | 247 | with AttrCleaner(f): | |
| 244 | 248 | argspec = getpydocspec(f, func) | |
| 245 | 249 | if argspec is None: | |
| 246 | 250 | return None | |
| 247 | 251 | 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 | ||
| 251 | 255 | ||
| 252 | 256 | ||
| 253 | 257 | def is_eval_safe_name(string): | |
| Back | FazBrowse Home | New Git URL |
0 commit comments