ec2b666284
Continuous Integration / Pre-commit Linter (push) Waiting to run
Continuous Integration / Mypy Check (Python 3.10) (push) Waiting to run
Continuous Integration / Mypy Check (Python 3.11) (push) Waiting to run
Continuous Integration / Mypy Check (Python 3.12) (push) Waiting to run
Continuous Integration / Mypy Check (Python 3.13) (push) Waiting to run
Continuous Integration / Unit Tests (Python 3.10) (push) Waiting to run
Continuous Integration / Unit Tests (Python 3.11) (push) Waiting to run
Continuous Integration / Unit Tests (Python 3.12) (push) Waiting to run
Continuous Integration / Unit Tests (Python 3.13) (push) Waiting to run
Continuous Integration / Unit Tests (Python 3.14) (push) Waiting to run
Continuous Integration / A2A v0.3 Tests (Python 3.10) (push) Waiting to run
Continuous Integration / A2A v0.3 Tests (Python 3.11) (push) Waiting to run
Continuous Integration / A2A v0.3 Tests (Python 3.12) (push) Waiting to run
Continuous Integration / A2A v0.3 Tests (Python 3.13) (push) Waiting to run
Continuous Integration / A2A v0.3 Tests (Python 3.14) (push) Waiting to run
Copybara PR Handler / close-imported-pr (push) Waiting to run
2.8 KiB
2.8 KiB
Visibility Style Guide
Python does not have native access modifiers (like public, private, or package-private). ADK relies on naming conventions and module structure to define visibility boundaries.
Conventions
1. Module-Private / Internal Files
- Private by Default: All new
.pymodule files undersrc/google/adk/must be private by default (prefixed with_). This is enforced by a pre-commit hook (check-new-py-prefix). - Even if a file contains symbols intended for the public API, the file itself must have a leading underscore. The symbols are then exposed via the package's
__init__.py. - Files intended for internal use within a package or subsystem must also be prefixed with a leading underscore (e.g.,
_task_models.py). - These files should never be imported directly by code outside of the ADK framework.
2. Class and Function Visibility
- Public: No leading underscore. Intended for use by consumers of the module or package.
- Internal/Private: Leading underscore (e.g.,
_private_method()). Intended only for use within the defining class or module.
3. Package-Private (Subsystem Visibility)
Since Python lacks true package-private access, we simulate it by:
- Not exporting the symbol in the package's
__init__.py. - Using
_-prefixed modules for internal implementation details. - Code within the same package can import from these
_modules, but code outside should not. - Direct Imports Required: Within the ADK framework, importing from
__init__.pyis not allowed. You must import from the specific module directly. This helps keep__init__.pyminimal and keeps packages as self-contained as possible.
4. Public API Export
- The public API of a package must be explicitly exported in
__init__.py. - Use
__all__: The__init__.pyfile should define__all__to explicitly list the symbols that are part of the public API. - Only public names (symbols intended for use outside the package) should be imported into
__init__.pyand listed in__all__. - Users should be able to import public symbols directly from the package level, rather than digging into internal modules.
Examples
Exposing a Public Interface
# In src/google/adk/agents/llm/task/_task_agent.py (File is private by default)
class TaskAgent: # Public symbol
...
# In src/google/adk/agents/llm/task/__init__.py
from ._task_agent import TaskAgent
__all__ = [
'TaskAgent',
]
Keeping Implementation Details Private
# In src/google/adk/agents/llm/task/_task_models.py (Internal file)
class TaskRequest(BaseModel): # Public within the module, but module is private
...
# In src/google/adk/agents/llm/task/__init__.py
# We DO NOT export TaskRequest here if it is only for internal use within the task package.