Show More
@@ -48,6 +48,9 b' _object_init_docstring = object.__init__.__doc__' | |||
|
48 | 48 | _builtin_type_docstrings = { |
|
49 | 49 | t.__doc__ for t in (types.ModuleType, types.MethodType, types.FunctionType) |
|
50 | 50 | } |
|
51 | ||
|
52 | _builtin_func_type = type(all) | |
|
53 | _builtin_meth_type = type(str.upper) # Bound methods have the same type as builtin functions | |
|
51 | 54 | #**************************************************************************** |
|
52 | 55 | # Builtin color schemes |
|
53 | 56 | |
@@ -180,6 +183,13 b' def getsource(obj,is_binary=False):' | |||
|
180 | 183 | encoding = get_encoding(obj) |
|
181 | 184 | return cast_unicode(src, encoding=encoding) |
|
182 | 185 | |
|
186 | ||
|
187 | def is_simple_callable(obj): | |
|
188 | """True if obj is a function ()""" | |
|
189 | return (inspect.isfunction(obj) or inspect.ismethod(obj) or \ | |
|
190 | isinstance(obj, _builtin_func_type) or isinstance(obj, _builtin_meth_type)) | |
|
191 | ||
|
192 | ||
|
183 | 193 | def getargspec(obj): |
|
184 | 194 | """Wrapper around :func:`inspect.getfullargspec` on Python 3, and |
|
185 | 195 | :func:inspect.getargspec` on Python 2. |
@@ -187,8 +197,7 b' def getargspec(obj):' | |||
|
187 | 197 | In addition to functions and methods, this can also handle objects with a |
|
188 | 198 | ``__call__`` attribute. |
|
189 | 199 | """ |
|
190 | if not (inspect.isfunction(obj) or inspect.ismethod(obj)) \ | |
|
191 | and safe_hasattr(obj, '__call__'): | |
|
200 | if safe_hasattr(obj, '__call__') and not is_simple_callable(obj): | |
|
192 | 201 | obj = obj.__call__ |
|
193 | 202 | |
|
194 | 203 | return inspect.getfullargspec(obj) if PY3 else inspect.getargspec(obj) |
@@ -767,7 +776,7 b' class Inspector:' | |||
|
767 | 776 | out['init_docstring'] = init_ds |
|
768 | 777 | |
|
769 | 778 | # Call form docstring for callable instances |
|
770 | if safe_hasattr(obj, '__call__'): | |
|
779 | if safe_hasattr(obj, '__call__') and not is_simple_callable(obj): | |
|
771 | 780 | call_def = self._getdef(obj.__call__, oname) |
|
772 | 781 | if call_def is not None: |
|
773 | 782 | out['call_def'] = self.format(call_def) |
@@ -115,6 +115,10 b' class Call(object):' | |||
|
115 | 115 | def method(self, x, z=2): |
|
116 | 116 | """Some method's docstring""" |
|
117 | 117 | |
|
118 | class SimpleClass(object): | |
|
119 | def method(self, x, z=2): | |
|
120 | """Some method's docstring""" | |
|
121 | ||
|
118 | 122 | |
|
119 | 123 | class OldStyle: |
|
120 | 124 | """An old-style class for testing.""" |
@@ -271,6 +275,13 b' def test_info_awkward():' | |||
|
271 | 275 | # Just test that this doesn't throw an error. |
|
272 | 276 | i = inspector.info(Awkward()) |
|
273 | 277 | |
|
278 | def test_calldef_none(): | |
|
279 | # We should ignore __call__ for all of these. | |
|
280 | for obj in [f, SimpleClass().method, any, str.upper]: | |
|
281 | print(obj) | |
|
282 | i = inspector.info(obj) | |
|
283 | nt.assert_is(i['call_def'], None) | |
|
284 | ||
|
274 | 285 | if py3compat.PY3: |
|
275 | 286 | exec("def f_kwarg(pos, *, kwonly): pass") |
|
276 | 287 |
General Comments 0
You need to be logged in to leave comments.
Login now