17db96d56Sopenharmony_ci:mod:`__main__` --- Top-level code environment
27db96d56Sopenharmony_ci==============================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: __main__
57db96d56Sopenharmony_ci   :synopsis: The environment where top-level code is run. Covers command-line
67db96d56Sopenharmony_ci              interfaces, import-time behavior, and ``__name__ == '__main__'``.
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci--------------
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciIn Python, the special name ``__main__`` is used for two important constructs:
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci1. the name of the top-level environment of the program, which can be
137db96d56Sopenharmony_ci   checked using the ``__name__ == '__main__'`` expression; and
147db96d56Sopenharmony_ci2. the ``__main__.py`` file in Python packages.
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciBoth of these mechanisms are related to Python modules; how users interact with
177db96d56Sopenharmony_cithem and how they interact with each other.  They are explained in detail
187db96d56Sopenharmony_cibelow.  If you're new to Python modules, see the tutorial section
197db96d56Sopenharmony_ci:ref:`tut-modules` for an introduction.
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci.. _name_equals_main:
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci``__name__ == '__main__'``
257db96d56Sopenharmony_ci---------------------------
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ciWhen a Python module or package is imported, ``__name__`` is set to the
287db96d56Sopenharmony_cimodule's name.  Usually, this is the name of the Python file itself without the
297db96d56Sopenharmony_ci``.py`` extension::
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci    >>> import configparser
327db96d56Sopenharmony_ci    >>> configparser.__name__
337db96d56Sopenharmony_ci    'configparser'
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ciIf the file is part of a package, ``__name__`` will also include the parent
367db96d56Sopenharmony_cipackage's path::
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci    >>> from concurrent.futures import process
397db96d56Sopenharmony_ci    >>> process.__name__
407db96d56Sopenharmony_ci    'concurrent.futures.process'
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ciHowever, if the module is executed in the top-level code environment,
437db96d56Sopenharmony_ciits ``__name__`` is set to the string ``'__main__'``.
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ciWhat is the "top-level code environment"?
467db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci``__main__`` is the name of the environment where top-level code is run.
497db96d56Sopenharmony_ci"Top-level code" is the first user-specified Python module that starts running.
507db96d56Sopenharmony_ciIt's "top-level" because it imports all other modules that the program needs.
517db96d56Sopenharmony_ciSometimes "top-level code" is called an *entry point* to the application.
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ciThe top-level code environment can be:
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci* the scope of an interactive prompt::
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci    >>> __name__
587db96d56Sopenharmony_ci    '__main__'
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci* the Python module passed to the Python interpreter as a file argument:
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci    .. code-block:: shell-session
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci       $ python3 helloworld.py
657db96d56Sopenharmony_ci       Hello, world!
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci* the Python module or package passed to the Python interpreter with the
687db96d56Sopenharmony_ci  :option:`-m` argument:
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci    .. code-block:: shell-session
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci       $ python3 -m tarfile
737db96d56Sopenharmony_ci       usage: tarfile.py [-h] [-v] (...)
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci* Python code read by the Python interpreter from standard input:
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci    .. code-block:: shell-session
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci       $ echo "import this" | python3
807db96d56Sopenharmony_ci       The Zen of Python, by Tim Peters
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci       Beautiful is better than ugly.
837db96d56Sopenharmony_ci       Explicit is better than implicit.
847db96d56Sopenharmony_ci       ...
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci* Python code passed to the Python interpreter with the :option:`-c` argument:
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci    .. code-block:: shell-session
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci       $ python3 -c "import this"
917db96d56Sopenharmony_ci       The Zen of Python, by Tim Peters
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci       Beautiful is better than ugly.
947db96d56Sopenharmony_ci       Explicit is better than implicit.
957db96d56Sopenharmony_ci       ...
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ciIn each of these situations, the top-level module's ``__name__`` is set to
987db96d56Sopenharmony_ci``'__main__'``.
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ciAs a result, a module can discover whether or not it is running in the
1017db96d56Sopenharmony_citop-level environment by checking its own ``__name__``, which allows a common
1027db96d56Sopenharmony_ciidiom for conditionally executing code when the module is not initialized from
1037db96d56Sopenharmony_cian import statement::
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci    if __name__ == '__main__':
1067db96d56Sopenharmony_ci        # Execute when the module is not initialized from an import statement.
1077db96d56Sopenharmony_ci        ...
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci.. seealso::
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci   For a more detailed look at how ``__name__`` is set in all situations, see
1127db96d56Sopenharmony_ci   the tutorial section :ref:`tut-modules`.
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ciIdiomatic Usage
1167db96d56Sopenharmony_ci^^^^^^^^^^^^^^^
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ciSome modules contain code that is intended for script use only, like parsing
1197db96d56Sopenharmony_cicommand-line arguments or fetching data from standard input.  If a module
1207db96d56Sopenharmony_cilike this was imported from a different module, for example to unit test
1217db96d56Sopenharmony_ciit, the script code would unintentionally execute as well.
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ciThis is where using the ``if __name__ == '__main__'`` code block comes in
1247db96d56Sopenharmony_cihandy. Code within this block won't run unless the module is executed in the
1257db96d56Sopenharmony_citop-level environment.
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ciPutting as few statements as possible in the block below ``if __name__ ==
1287db96d56Sopenharmony_ci'__main__'`` can improve code clarity and correctness. Most often, a function
1297db96d56Sopenharmony_cinamed ``main`` encapsulates the program's primary behavior::
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci    # echo.py
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci    import shlex
1347db96d56Sopenharmony_ci    import sys
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci    def echo(phrase: str) -> None:
1377db96d56Sopenharmony_ci       """A dummy wrapper around print."""
1387db96d56Sopenharmony_ci       # for demonstration purposes, you can imagine that there is some
1397db96d56Sopenharmony_ci       # valuable and reusable logic inside this function
1407db96d56Sopenharmony_ci       print(phrase)
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci    def main() -> int:
1437db96d56Sopenharmony_ci        """Echo the input arguments to standard output"""
1447db96d56Sopenharmony_ci        phrase = shlex.join(sys.argv)
1457db96d56Sopenharmony_ci        echo(phrase)
1467db96d56Sopenharmony_ci        return 0
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci    if __name__ == '__main__':
1497db96d56Sopenharmony_ci        sys.exit(main())  # next section explains the use of sys.exit
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ciNote that if the module didn't encapsulate code inside the ``main`` function
1527db96d56Sopenharmony_cibut instead put it directly within the ``if __name__ == '__main__'`` block,
1537db96d56Sopenharmony_cithe ``phrase`` variable would be global to the entire module.  This is
1547db96d56Sopenharmony_cierror-prone as other functions within the module could be unintentionally using
1557db96d56Sopenharmony_cithe global variable instead of a local name.  A ``main`` function solves this
1567db96d56Sopenharmony_ciproblem.
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ciUsing a ``main`` function has the added benefit of the ``echo`` function itself
1597db96d56Sopenharmony_cibeing isolated and importable elsewhere. When ``echo.py`` is imported, the
1607db96d56Sopenharmony_ci``echo`` and ``main`` functions will be defined, but neither of them will be
1617db96d56Sopenharmony_cicalled, because ``__name__ != '__main__'``.
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ciPackaging Considerations
1657db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci``main`` functions are often used to create command-line tools by specifying
1687db96d56Sopenharmony_cithem as entry points for console scripts.  When this is done,
1697db96d56Sopenharmony_ci`pip <https://pip.pypa.io/>`_ inserts the function call into a template script,
1707db96d56Sopenharmony_ciwhere the return value of ``main`` is passed into :func:`sys.exit`.
1717db96d56Sopenharmony_ciFor example::
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci    sys.exit(main())
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ciSince the call to ``main`` is wrapped in :func:`sys.exit`, the expectation is
1767db96d56Sopenharmony_cithat your function will return some value acceptable as an input to
1777db96d56Sopenharmony_ci:func:`sys.exit`; typically, an integer or ``None`` (which is implicitly
1787db96d56Sopenharmony_cireturned if your function does not have a return statement).
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ciBy proactively following this convention ourselves, our module will have the
1817db96d56Sopenharmony_cisame behavior when run directly (i.e. ``python3 echo.py``) as it will have if
1827db96d56Sopenharmony_ciwe later package it as a console script entry-point in a pip-installable
1837db96d56Sopenharmony_cipackage.
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ciIn particular, be careful about returning strings from your ``main`` function.
1867db96d56Sopenharmony_ci:func:`sys.exit` will interpret a string argument as a failure message, so
1877db96d56Sopenharmony_ciyour program will have an exit code of ``1``, indicating failure, and the
1887db96d56Sopenharmony_cistring will be written to :data:`sys.stderr`.  The ``echo.py`` example from
1897db96d56Sopenharmony_ciearlier exemplifies using the ``sys.exit(main())`` convention.
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ci.. seealso::
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci   `Python Packaging User Guide <https://packaging.python.org/>`_
1947db96d56Sopenharmony_ci   contains a collection of tutorials and references on how to distribute and
1957db96d56Sopenharmony_ci   install Python packages with modern tools.
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci``__main__.py`` in Python Packages
1997db96d56Sopenharmony_ci----------------------------------
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ciIf you are not familiar with Python packages, see section :ref:`tut-packages`
2027db96d56Sopenharmony_ciof the tutorial.  Most commonly, the ``__main__.py`` file is used to provide
2037db96d56Sopenharmony_cia command-line interface for a package. Consider the following hypothetical
2047db96d56Sopenharmony_cipackage, "bandclass":
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci.. code-block:: text
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci   bandclass
2097db96d56Sopenharmony_ci     ├── __init__.py
2107db96d56Sopenharmony_ci     ├── __main__.py
2117db96d56Sopenharmony_ci     └── student.py
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci``__main__.py`` will be executed when the package itself is invoked
2147db96d56Sopenharmony_cidirectly from the command line using the :option:`-m` flag. For example:
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci.. code-block:: shell-session
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci   $ python3 -m bandclass
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ciThis command will cause ``__main__.py`` to run. How you utilize this mechanism
2217db96d56Sopenharmony_ciwill depend on the nature of the package you are writing, but in this
2227db96d56Sopenharmony_cihypothetical case, it might make sense to allow the teacher to search for
2237db96d56Sopenharmony_cistudents::
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci    # bandclass/__main__.py
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci    import sys
2287db96d56Sopenharmony_ci    from .student import search_students
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci    student_name = sys.argv[2] if len(sys.argv) >= 2 else ''
2317db96d56Sopenharmony_ci    print(f'Found student: {search_students(student_name)}')
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ciNote that ``from .student import search_students`` is an example of a relative
2347db96d56Sopenharmony_ciimport.  This import style can be used when referencing modules within a
2357db96d56Sopenharmony_cipackage.  For more details, see :ref:`intra-package-references` in the
2367db96d56Sopenharmony_ci:ref:`tut-modules` section of the tutorial.
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ciIdiomatic Usage
2397db96d56Sopenharmony_ci^^^^^^^^^^^^^^^
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ciThe contents of ``__main__.py`` typically isn't fenced with
2427db96d56Sopenharmony_ci``if __name__ == '__main__'`` blocks.  Instead, those files are kept short,
2437db96d56Sopenharmony_cifunctions to execute from other modules.  Those other modules can then be
2447db96d56Sopenharmony_cieasily unit-tested and are properly reusable.
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ciIf used, an ``if __name__ == '__main__'`` block will still work as expected
2477db96d56Sopenharmony_cifor a ``__main__.py`` file within a package, because its ``__name__``
2487db96d56Sopenharmony_ciattribute will include the package's path if imported::
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci    >>> import asyncio.__main__
2517db96d56Sopenharmony_ci    >>> asyncio.__main__.__name__
2527db96d56Sopenharmony_ci    'asyncio.__main__'
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ciThis won't work for ``__main__.py`` files in the root directory of a .zip file
2557db96d56Sopenharmony_cithough.  Hence, for consistency, minimal ``__main__.py`` like the :mod:`venv`
2567db96d56Sopenharmony_cione mentioned below are preferred.
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci.. seealso::
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci   See :mod:`venv` for an example of a package with a minimal ``__main__.py``
2617db96d56Sopenharmony_ci   in the standard library. It doesn't contain a ``if __name__ == '__main__'``
2627db96d56Sopenharmony_ci   block. You can invoke it with ``python -m venv [directory]``.
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ci   See :mod:`runpy` for more details on the :option:`-m` flag to the
2657db96d56Sopenharmony_ci   interpreter executable.
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci   See :mod:`zipapp` for how to run applications packaged as *.zip* files. In
2687db96d56Sopenharmony_ci   this case Python looks for a ``__main__.py`` file in the root directory of
2697db96d56Sopenharmony_ci   the archive.
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci``import __main__``
2747db96d56Sopenharmony_ci-------------------
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ciRegardless of which module a Python program was started with, other modules
2777db96d56Sopenharmony_cirunning within that same program can import the top-level environment's scope
2787db96d56Sopenharmony_ci(:term:`namespace`) by importing the ``__main__`` module.  This doesn't import
2797db96d56Sopenharmony_cia ``__main__.py`` file but rather whichever module that received the special
2807db96d56Sopenharmony_ciname ``'__main__'``.
2817db96d56Sopenharmony_ci
2827db96d56Sopenharmony_ciHere is an example module that consumes the ``__main__`` namespace::
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci    # namely.py
2857db96d56Sopenharmony_ci
2867db96d56Sopenharmony_ci    import __main__
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci    def did_user_define_their_name():
2897db96d56Sopenharmony_ci        return 'my_name' in dir(__main__)
2907db96d56Sopenharmony_ci
2917db96d56Sopenharmony_ci    def print_user_name():
2927db96d56Sopenharmony_ci        if not did_user_define_their_name():
2937db96d56Sopenharmony_ci            raise ValueError('Define the variable `my_name`!')
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ci        if '__file__' in dir(__main__):
2967db96d56Sopenharmony_ci            print(__main__.my_name, "found in file", __main__.__file__)
2977db96d56Sopenharmony_ci        else:
2987db96d56Sopenharmony_ci            print(__main__.my_name)
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ciExample usage of this module could be as follows::
3017db96d56Sopenharmony_ci
3027db96d56Sopenharmony_ci    # start.py
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci    import sys
3057db96d56Sopenharmony_ci
3067db96d56Sopenharmony_ci    from namely import print_user_name
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci    # my_name = "Dinsdale"
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci    def main():
3117db96d56Sopenharmony_ci        try:
3127db96d56Sopenharmony_ci            print_user_name()
3137db96d56Sopenharmony_ci        except ValueError as ve:
3147db96d56Sopenharmony_ci            return str(ve)
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci    if __name__ == "__main__":
3177db96d56Sopenharmony_ci        sys.exit(main())
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ciNow, if we started our program, the result would look like this:
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci.. code-block:: shell-session
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci   $ python3 start.py
3247db96d56Sopenharmony_ci   Define the variable `my_name`!
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ciThe exit code of the program would be 1, indicating an error. Uncommenting the
3277db96d56Sopenharmony_ciline with ``my_name = "Dinsdale"`` fixes the program and now it exits with
3287db96d56Sopenharmony_cistatus code 0, indicating success:
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_ci.. code-block:: shell-session
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci   $ python3 start.py
3337db96d56Sopenharmony_ci   Dinsdale found in file /path/to/start.py
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ciNote that importing ``__main__`` doesn't cause any issues with unintentionally
3367db96d56Sopenharmony_cirunning top-level code meant for script use which is put in the
3377db96d56Sopenharmony_ci``if __name__ == "__main__"`` block of the ``start`` module. Why does this work?
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ciPython inserts an empty ``__main__`` module in :attr:`sys.modules` at
3407db96d56Sopenharmony_ciinterpreter startup, and populates it by running top-level code. In our example
3417db96d56Sopenharmony_cithis is the ``start`` module which runs line by line and imports ``namely``.
3427db96d56Sopenharmony_ciIn turn, ``namely`` imports ``__main__`` (which is really ``start``). That's an
3437db96d56Sopenharmony_ciimport cycle! Fortunately, since the partially populated ``__main__``
3447db96d56Sopenharmony_cimodule is present in :attr:`sys.modules`, Python passes that to ``namely``.
3457db96d56Sopenharmony_ciSee :ref:`Special considerations for __main__ <import-dunder-main>` in the
3467db96d56Sopenharmony_ciimport system's reference for details on how this works.
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_ciThe Python REPL is another example of a "top-level environment", so anything
3497db96d56Sopenharmony_cidefined in the REPL becomes part of the ``__main__`` scope::
3507db96d56Sopenharmony_ci
3517db96d56Sopenharmony_ci    >>> import namely
3527db96d56Sopenharmony_ci    >>> namely.did_user_define_their_name()
3537db96d56Sopenharmony_ci    False
3547db96d56Sopenharmony_ci    >>> namely.print_user_name()
3557db96d56Sopenharmony_ci    Traceback (most recent call last):
3567db96d56Sopenharmony_ci    ...
3577db96d56Sopenharmony_ci    ValueError: Define the variable `my_name`!
3587db96d56Sopenharmony_ci    >>> my_name = 'Jabberwocky'
3597db96d56Sopenharmony_ci    >>> namely.did_user_define_their_name()
3607db96d56Sopenharmony_ci    True
3617db96d56Sopenharmony_ci    >>> namely.print_user_name()
3627db96d56Sopenharmony_ci    Jabberwocky
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ciNote that in this case the ``__main__`` scope doesn't contain a ``__file__``
3657db96d56Sopenharmony_ciattribute as it's interactive.
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ciThe ``__main__`` scope is used in the implementation of :mod:`pdb` and
3687db96d56Sopenharmony_ci:mod:`rlcompleter`.
369