hab ich mir mal angeschaut wie das asyncio package https://github.com/python/cpython/tree/main/Lib/asyncio auf github aufgebaut ist.
Was ich dabei gelernt habe, ist hier in einem kleinen Demo-Package dargestellt.
- Die __init__.py öffnet grundsätzlich die Möglichkeit durch > from <module> import * < alle Namen zu importieren
- _unterstrich_namen werden dabei schon mal herausgefiltert
- Mit __all__ hat man die Möglichkeit diese Namen die eigentlich nicht öffentlich sichtbar sein sollten, doch wieder sichtbar zu machen.
Packagestruktur:
prog.py
./some_package
__init__.py
main.py
utils.py
Code: Alles auswählen
"""
Demo for using __all__ and _underscore_names to control
which names can be exposed by a package
"""
import some_package
try:
print(some_package.regular_main())
except AttributeError as attribute_error:
print(attribute_error)
try:
print(some_package._underscore_main())
except AttributeError as attribute_error:
print(attribute_error)
try:
print(some_package.regular_utils())
except AttributeError as attribute_error:
print(attribute_error)
try:
print(some_package._underscore_utils())
except AttributeError as attribute_error:
print(attribute_error)
regular_main
module 'some_package' has no attribute '_underscore_main'
regular_utils
_underscore_utils
Die Verwendung von _underscore_main wirft eine Exception während _underscore_utils verwendet werden kann
Code: Alles auswählen
""" __init__.py """
from .main import *
from .utils import *
__all__ = main.__all__ + utils.__all__
Code: Alles auswählen
""" main.py
__all__ only redundently exposes regular_main, keeping _underscore_main hidden
"""
__all__ = ("regular_main",)
def _underscore_main():
return "_underscore_main"
def regular_main():
return "regular_main"
Code: Alles auswählen
""" utils.py
__all__ explicitly exposes the name _underscore_utils overriding the default behavior
"""
__all__ = ("_underscore_utils", "regular_utils")
def _underscore_utils():
return "_underscore_utils"
def regular_utils():
return "regular_utils"