Skip to content

gh-61310: Document package precedence over same-named modules#153211

Open
TheD0ubleC wants to merge 1 commit into
python:mainfrom
TheD0ubleC:gh-61310-document-package-module-precedence
Open

gh-61310: Document package precedence over same-named modules#153211
TheD0ubleC wants to merge 1 commit into
python:mainfrom
TheD0ubleC:gh-61310-document-package-module-precedence

Conversation

@TheD0ubleC

Copy link
Copy Markdown

Document that the default filesystem finder checks for regular packages before same-named modules within a single path entry.

This clarifies the behavior reported in gh-61310 while preserving the existing sys.path ordering semantics: a module found in an earlier path entry still takes precedence over a package found in a later one.

Validation:

  • Verified locally that import spam imports spam/__init__.py when both spam/__init__.py and spam.py exist in the same directory.
  • Verified locally that sys.path order still takes precedence across different path entries.
  • Ran git diff --check.

Docs build was not run because Sphinx is not installed in this environment.

@read-the-docs-community

Copy link
Copy Markdown

Documentation build overview

📚 cpython-previews | 🛠️ Build #33461560 | 📁 Comparing 70c4ca3 against main (2d7a74e)

  🔍 Preview build  

1 file changed
± reference/import.html

@TheD0ubleC TheD0ubleC marked this pull request as ready for review July 6, 2026 15:12
Comment thread Doc/reference/import.rst
Comment on lines +668 to +673
Within a single file system path entry, the default finder checks for regular
packages before same-named modules. For example, if the same directory contains
both ``spam/__init__.py`` and ``spam.py``, ``import spam`` will import the
package from ``spam/__init__.py``. This does not override the order of
:data:`sys.path`: a module found in an earlier path entry still takes precedence
over a package found in a later one.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Within a single file system path entry, the default finder checks for regular
packages before same-named modules. For example, if the same directory contains
both ``spam/__init__.py`` and ``spam.py``, ``import spam`` will import the
package from ``spam/__init__.py``. This does not override the order of
:data:`sys.path`: a module found in an earlier path entry still takes precedence
over a package found in a later one.
Within a single :term:`path entry`, the default path entry finders check for a
:term:`regular package` first, then for extension modules, then for source
files, and finally for bytecode files. For example, if the same directory
contains both ``spam/__init__.py`` and ``spam.py``, ``import spam`` will
import the package from ``spam/__init__.py``. A directory without an
``__init__.py`` file is treated as a :term:`namespace package` portion only if
no matching module is found. Note that this does not override the order of the
:term:`import path`.

We should use consistent terminology, and let's link to the glossary when we can, as it is helpful to readers. Your text omits the final step of the search for namespace packages. Additionally let's expand a little and resolve #93435 too. Finally, we don't need to dwell on this not affecting the import path.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting review docs Documentation in the Doc dir skip news

Projects

Status: Todo

Development

Successfully merging this pull request may close these issues.

2 participants