Clarification about how to implement namespace packages (as in PEP 420) via import hooks for PEP 660 use case
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 20/100
Hướng nghiên cứu
Bắt đầu bằng cách đọc Lib/importlib._bootstrap_external.py xung quanh phần triển khai namespace package được tham chiếu, sau đó so sánh PEP 420 với các cuộc thảo luận Discourse được liên kết và gist proof-of-concept. Công việc được xem là hoàn tất khi đã xác định và ghi lại liệu Solutions A hoặc B có tương thích với đặc tả hay không, cũng như các import hooks nên hỗ trợ trường hợp sử dụng PEP 660 như thế nào.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
This is a follow up of 2 previous discussions in the Python discourse and an issue in pypa/packaging-problems:
- https://discuss.python.org/t/pep-660-and-setuptools/14855/15
- https://discuss.python.org/t/how-to-implement-namespace-packages-as-in-pep-420-via-import-hooks/15192
- https://github.com/pypa/packaging-problems/issues/588
Summary
One of the popular ways of implementing PEP 660 is via import hooks (since other alternatives like symlinking package folders are not available in all platforms).
However the reference implementation editables currently does not support namespaces.
Specifically the dynamic path computation aspect of PEP 420 is a challenge.
After inspecting the implementation for importlib._bootstrap_external, I may have managed to find 2 solutions for this problem, described in the detail in this discourse post and demonstrated as a PoC in this gist:
- Solution A: Create a custom "path class" that tries to emulate the
_NamespacePathbehaviour. - Solution B: Create a custom
PathEntryFinderand add a “bogus” entry tosys.pathjust to trigger it (implicitly relying thatimportlib.machinery.PathFinderwill take care of setting__path__to_NamespacePathobject under the hood).
However, the problem is that I don't know if these approaches are reliable in the long run and in accordance with the language specification.
Open Questions
Questions like the following are still not clear to me:
- Is there a chance that an internal check for namespace packages will fail if
__path__uses a custom class instead of_NamespacePatheven if the behaviour described in PEP 420 is observed? - Can we rely on the fact that the import machinery will automatically set the namespace loader for specs in the form of
ModuleSpec("name", None, is_package=True)? - Is
pkgutil(and particularlypkgutil.extend_path) still considered first class citizen of the standard library or is it better to avoid it when writing new code? - Can we rely on the behaviour of
sys.path_hooks+importlib.machinery.PathFinderto createModuleSpecobjects for namespaces that will automatically perform dynamic path computation? Or is this an internal implementation detail that can change in the future?
If the discussed approaches are not recommended, how can we support namespace packages using import hooks and deliver a complete solution for PEP 660?
- Ngôn ngữ chính
- Python
- Star
- 77.2k
- Fork
- 36k
- Merge trung bình
- 1 ngày 9 giờ
- Pull request đã merge (30 ngày)
- 558
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của python/cpython
-
docs pending
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
-
stdlib type-feature
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
-
stdlib type-feature
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
-
build type-bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
-
stdlib topic-email type-feature
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
Tất cả issue của python/cpython
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 74/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
PolicyEngine/policyengine-us#9559 ·
-
priority: p3
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
googleapis/librarian#7636 ·
-
from:qa priority:P2 reliability tech-debt
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
spec-kitty/spec-kitty#4874 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100