Skip to content

inspect.getmembers is not fully tested #116789

Open
@sobolevn

Description

@sobolevn

Bug report

Right now test_inspect checks getmembers with mostly classes and methods.
It does not test: function, traceback, code, frame, generator, coroutine, and builtin objects.
We should also test how predicate works for these objects.

However, they are listed in the docs:

+===========+===================+===========================+
| class | __doc__ | documentation string |
+-----------+-------------------+---------------------------+
| | __name__ | name with which this |
| | | class was defined |
+-----------+-------------------+---------------------------+
| | __qualname__ | qualified name |
+-----------+-------------------+---------------------------+
| | __module__ | name of module in which |
| | | this class was defined |
+-----------+-------------------+---------------------------+
| method | __doc__ | documentation string |
+-----------+-------------------+---------------------------+
| | __name__ | name with which this |
| | | method was defined |
+-----------+-------------------+---------------------------+
| | __qualname__ | qualified name |
+-----------+-------------------+---------------------------+
| | __func__ | function object |
| | | containing implementation |
| | | of method |
+-----------+-------------------+---------------------------+
| | __self__ | instance to which this |
| | | method is bound, or |
| | | ``None`` |
+-----------+-------------------+---------------------------+
| | __module__ | name of module in which |
| | | this method was defined |
+-----------+-------------------+---------------------------+
| function | __doc__ | documentation string |
+-----------+-------------------+---------------------------+
| | __name__ | name with which this |
| | | function was defined |
+-----------+-------------------+---------------------------+
| | __qualname__ | qualified name |
+-----------+-------------------+---------------------------+
| | __code__ | code object containing |
| | | compiled function |
| | | :term:`bytecode` |
+-----------+-------------------+---------------------------+
| | __defaults__ | tuple of any default |
| | | values for positional or |
| | | keyword parameters |
+-----------+-------------------+---------------------------+
| | __kwdefaults__ | mapping of any default |
| | | values for keyword-only |
| | | parameters |
+-----------+-------------------+---------------------------+
| | __globals__ | global namespace in which |
| | | this function was defined |
+-----------+-------------------+---------------------------+
| | __builtins__ | builtins namespace |
+-----------+-------------------+---------------------------+
| | __annotations__ | mapping of parameters |
| | | names to annotations; |
| | | ``"return"`` key is |
| | | reserved for return |
| | | annotations. |
+-----------+-------------------+---------------------------+
| | __module__ | name of module in which |
| | | this function was defined |
+-----------+-------------------+---------------------------+
| traceback | tb_frame | frame object at this |
| | | level |
+-----------+-------------------+---------------------------+
| | tb_lasti | index of last attempted |
| | | instruction in bytecode |
+-----------+-------------------+---------------------------+
| | tb_lineno | current line number in |
| | | Python source code |
+-----------+-------------------+---------------------------+
| | tb_next | next inner traceback |
| | | object (called by this |
| | | level) |
+-----------+-------------------+---------------------------+
| frame | f_back | next outer frame object |
| | | (this frame's caller) |
+-----------+-------------------+---------------------------+
| | f_builtins | builtins namespace seen |
| | | by this frame |
+-----------+-------------------+---------------------------+
| | f_code | code object being |
| | | executed in this frame |
+-----------+-------------------+---------------------------+
| | f_globals | global namespace seen by |
| | | this frame |
+-----------+-------------------+---------------------------+
| | f_lasti | index of last attempted |
| | | instruction in bytecode |
+-----------+-------------------+---------------------------+
| | f_lineno | current line number in |
| | | Python source code |
+-----------+-------------------+---------------------------+
| | f_locals | local namespace seen by |
| | | this frame |
+-----------+-------------------+---------------------------+
| | f_trace | tracing function for this |
| | | frame, or ``None`` |
+-----------+-------------------+---------------------------+
| code | co_argcount | number of arguments (not |
| | | including keyword only |
| | | arguments, \* or \*\* |
| | | args) |
+-----------+-------------------+---------------------------+
| | co_code | string of raw compiled |
| | | bytecode |
+-----------+-------------------+---------------------------+
| | co_cellvars | tuple of names of cell |
| | | variables (referenced by |
| | | containing scopes) |
+-----------+-------------------+---------------------------+
| | co_consts | tuple of constants used |
| | | in the bytecode |
+-----------+-------------------+---------------------------+
| | co_filename | name of file in which |
| | | this code object was |
| | | created |
+-----------+-------------------+---------------------------+
| | co_firstlineno | number of first line in |
| | | Python source code |
+-----------+-------------------+---------------------------+
| | co_flags | bitmap of ``CO_*`` flags, |
| | | read more :ref:`here |
| | | <inspect-module-co-flags>`|
+-----------+-------------------+---------------------------+
| | co_lnotab | encoded mapping of line |
| | | numbers to bytecode |
| | | indices |
+-----------+-------------------+---------------------------+
| | co_freevars | tuple of names of free |
| | | variables (referenced via |
| | | a function's closure) |
+-----------+-------------------+---------------------------+
| | co_posonlyargcount| number of positional only |
| | | arguments |
+-----------+-------------------+---------------------------+
| | co_kwonlyargcount | number of keyword only |
| | | arguments (not including |
| | | \*\* arg) |
+-----------+-------------------+---------------------------+
| | co_name | name with which this code |
| | | object was defined |
+-----------+-------------------+---------------------------+
| | co_qualname | fully qualified name with |
| | | which this code object |
| | | was defined |
+-----------+-------------------+---------------------------+
| | co_names | tuple of names other |
| | | than arguments and |
| | | function locals |
+-----------+-------------------+---------------------------+
| | co_nlocals | number of local variables |
+-----------+-------------------+---------------------------+
| | co_stacksize | virtual machine stack |
| | | space required |
+-----------+-------------------+---------------------------+
| | co_varnames | tuple of names of |
| | | arguments and local |
| | | variables |
+-----------+-------------------+---------------------------+
| generator | __name__ | name |
+-----------+-------------------+---------------------------+
| | __qualname__ | qualified name |
+-----------+-------------------+---------------------------+
| | gi_frame | frame |
+-----------+-------------------+---------------------------+
| | gi_running | is the generator running? |
+-----------+-------------------+---------------------------+
| | gi_code | code |
+-----------+-------------------+---------------------------+
| | gi_yieldfrom | object being iterated by |
| | | ``yield from``, or |
| | | ``None`` |
+-----------+-------------------+---------------------------+
| coroutine | __name__ | name |
+-----------+-------------------+---------------------------+
| | __qualname__ | qualified name |
+-----------+-------------------+---------------------------+
| | cr_await | object being awaited on, |
| | | or ``None`` |
+-----------+-------------------+---------------------------+
| | cr_frame | frame |
+-----------+-------------------+---------------------------+
| | cr_running | is the coroutine running? |
+-----------+-------------------+---------------------------+
| | cr_code | code |
+-----------+-------------------+---------------------------+
| | cr_origin | where coroutine was |
| | | created, or ``None``. See |
| | | |coroutine-origin-link| |
+-----------+-------------------+---------------------------+
| builtin | __doc__ | documentation string |
+-----------+-------------------+---------------------------+
| | __name__ | original name of this |
| | | function or method |
+-----------+-------------------+---------------------------+
| | __qualname__ | qualified name |
+-----------+-------------------+---------------------------+
| | __self__ | instance to which a |
| | | method is bound, or |
| | | ``None`` |
+-----------+-------------------+---------------------------+

I will send a PR with new tests.

Linked PRs

Metadata

Metadata

Assignees

Labels

testsTests in the Lib/test dirtype-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions