Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to make the imports within `__init__.py` visible for python `help()` command?

Suppose I have a module:

mymodule/example.py:

def add_one(number):
    return number + 1

And mymodule/__init__.py:

from .example import *

foo = "FOO"

def bar():
    return 1

Now I see the function at the root of mymodule:

>>> import mymodule
>>> mymodule.add_one(3)
4
>>> mymodule.foo
'FOO'

Also, I see imported add_one through dir along with example:

>>> dir(mymodule)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'add_one', 'bar', 'example', 'foo']

But when I type help(mymodule) I see only example, foo and bar, but not the imported add_one:

Help on package mymodule:

NAME
    mymodule

PACKAGE CONTENTS
    example

FUNCTIONS
    bar()

DATA
    foo = 'FOO'

But I can call add_one() as the root function of mymodule. Is it possible to see it in help as root function?

like image 775
Slowpoke Avatar asked Oct 12 '21 12:10

Slowpoke


People also ask

What does __ init __ py do in Python?

The __init__.py file makes Python treat directories containing it as modules. Furthermore, this is the first file to be loaded in a module, so you can use it to execute code that you want to run each time a module is loaded, or specify the submodules to be exported.

What should __ init __ py contain?

The gist is that __init__.py is used to indicate that a directory is a python package. (A quick note about packages vs. modules from the python docs: "From a file system perspective, packages are directories and modules are files.").

How do imports work in Python?

In Python, you use the import keyword to make code in one module available in another. Imports in Python are important for structuring your code effectively. Using imports properly will make you more productive, allowing you to reuse code while keeping your projects maintainable.


1 Answers

From the source code of help() (docmodule under pydoc.py)

        for key, value in inspect.getmembers(object, inspect.isroutine):
            # if __all__ exists, believe it.  Otherwise use old heuristic.
            if (all is not None or
                inspect.isbuiltin(value) or inspect.getmodule(value) is object):
                if visiblename(key, all, object):
                    funcs.append((key, value))

The important part is inspect.getmodule(value) is object), this is where values that are not directly part of the object itself are dropped

You can add this line

__all__ = ['bar', 'add_one', 'FOO']

to your __init__.py file, this way the help function will make sure to include these objects in help

Keep in mind that if you do this anything you don't include in this list will not be included

like image 96
Ron Serruya Avatar answered Oct 21 '22 11:10

Ron Serruya