aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6
diff options
context:
space:
mode:
Diffstat (limited to 'sources/pyside6')
-rw-r--r--sources/pyside6/PySide6/__init__.py.in17
-rw-r--r--sources/pyside6/tests/pysidetest/all_modules_load_test.py12
2 files changed, 27 insertions, 2 deletions
diff --git a/sources/pyside6/PySide6/__init__.py.in b/sources/pyside6/PySide6/__init__.py.in
index 5dc80c7aa..ca3b7fc6a 100644
--- a/sources/pyside6/PySide6/__init__.py.in
+++ b/sources/pyside6/PySide6/__init__.py.in
@@ -1,6 +1,8 @@
import os
import sys
from pathlib import Path
+from types import ModuleType
+# mypy: disable-error-code="name-defined"
# __all__ is computed below.
__pre_all__ = [@init_modules@]
@@ -60,6 +62,7 @@ def _setupQtDirectories():
try:
# PYSIDE-1497: we use the build dir or install dir or site-packages, whatever the path
# setting dictates. There is no longer a difference in path structure.
+ global Shiboken
from shiboken6 import Shiboken
except Exception:
paths = ', '.join(sys.path)
@@ -121,4 +124,18 @@ def __getattr__(name: str) -> list[str]:
raise AttributeError(f"module '{__name__}' has no attribute '{name}' :)")
+# Be prepared that people can access the module dict instead.
+class ModuleDict(dict):
+ def __missing__(self, key):
+ if key == "__all__":
+ self[key] = __all__ if "__all__" in globals() else __getattr__("__all__")
+ return __all__
+ raise KeyError(f"dict of module '{__name__}' has no key '{key}' :)")
+
+
+class SubModule(ModuleType):
+ pass
+
+
_setupQtDirectories()
+Shiboken.replaceModuleDict(sys.modules["PySide6"], SubModule, ModuleDict(globals()))
diff --git a/sources/pyside6/tests/pysidetest/all_modules_load_test.py b/sources/pyside6/tests/pysidetest/all_modules_load_test.py
index 16f2369a7..6b3ebe732 100644
--- a/sources/pyside6/tests/pysidetest/all_modules_load_test.py
+++ b/sources/pyside6/tests/pysidetest/all_modules_load_test.py
@@ -13,18 +13,26 @@ init_test_paths(False)
import PySide6
+
# Note:
# "from PySide6 import *" can only be used at module level.
# It is also really not recommended to use. But for testing,
# the "__all__" variable is a great feature!
-
-
class AllModulesImportTest(unittest.TestCase):
def testAllModulesCanImport(self):
# would also work: exec("from PySide6 import *")
for name in PySide6.__all__:
exec(f"import PySide6.{name}")
+ def testAllReappearsAfterDel(self):
+ # This is the only incompatibility that remains:
+ # After __all__ is deleted, it will re-appear.
+ PySide6.__all__ = 42
+ self.assertEqual(PySide6.__dict__["__all__"], 42)
+ del PySide6.__all__
+ self.assertTrue(PySide6.__dict__["__all__"])
+ self.assertNotEqual(PySide6.__dict__["__all__"], 42)
+
if __name__ == '__main__':
unittest.main()