Nhập khẩu __init__.py và tuyên bố 'nhập khẩu'


0 Phiếu
Đã hỏi 24/5/2016 bởi for_that (460 điểm)
Tôi đã chạy vào một vấn đề với việc có hàng nhập khẩu trong __init__.py và sử dụng import as với hàng nhập khẩu tuyệt đối trong mô-đun của gói. Dự án của tôi có một subpackage và trong __init__.py của tôi "nâng" một trong các lớp học từ một module để subpackage với from import as tuyên bố. module nhập khẩu các module khác từ đó subpackage với hàng nhập khẩu tuyệt đối. Tôi nhận được này AttributeError: 'module' object has no attribute 'subpkg' error .

ví dụ

cấu trúc :
pkg/
├── __init__.py
├── subpkg
│   ├── __init__.py
│   ├── one.py
│   └── two_longname.py
└── tst.py
pkg/__init__.py là trống rỗng. pkg/subpkg/__init__.py :
from pkg.subpkg.one import One
pkg/subpkg/one.py :
import pkg.subpkg.two_longname as two
class One(two.Two):
    pass
pkg/subpkg/two_longname.py :
class Two:
    pass
pkg/tst.py :
from pkg.subpkg import One
print(One)
ra :
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest2/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/__init__.py", line 1, in <module>
    from pkg.subpkg.one import One
  File "/home/and/dev/test/python/imptest2/pkg/subpkg/one.py", line 1, in <module>
    import pkg.subpkg.two_longname as two
AttributeError: 'module' object has no attribute 'subpkg'

cách giải quyết

có những thay đổi làm cho nó hoạt động:
  1. rỗng pkg/subpkg/__init__.py và nhập khẩu trực tiếp từ pkg.subpkg.one. Tôi không xem xét việc này như là một lựa chọn bởi vì AFAIK "nâng" những thứ để cấp độ package là ok. Đây là báo giá từ một bài viết:
    một trong những điều phổ biến để làm điều của bạn init .py là để nhập khẩu các lớp đã chọn, chức năng, vv vào cấp độ package để họ có thể là convieniently nhập khẩu từ các gói phần mềm.
  2. thay đổi import as để from import trong one.py:
    from pkg.subpkg import two_longname
    class One(two_longname.Two):
        pass
    
    duy nhất con ở đây là tôi không thể tạo một bí danh ngắn cho mô-đun. Tôi đã nhận ý tưởng từ của câu trả lời.
cũng có thể sử dụng một nhập khẩu tương đối trong one.py để khắc phục sự cố. Nhưng tôi nghĩ rằng nó chỉ là một biến thể của workaround #2.

câu hỏi

  1. có thể ai đó giải thích những gì thực sự xảy ra ở đây? Tại sao sự kết hợp của hàng nhập khẩu ở __init__.py và sử dụng của import as dẫn đến vấn đề như vậy?
  2. có bất kỳ cách giải quyết tốt hơn?

ban đầu ví dụ

đây là ví dụ ban đầu của tôi. Nó không phải là rất thực tế, nhưng tôi không phải là xóa bỏ nó như vậy là trả lời vẫn còn làm cho tinh thần. pkg/__init__.py là sản phẩm nào. pkg/subpkg/__init__.py :
from pkg.subpkg.one import ONE
pkg/subpkg/one.py :
import pkg.subpkg.two
ONE = pkg.subpkg.two.TWO
pkg/subpkg/two.py :
TWO = 2
pkg/tst.py :
from pkg.subpkg import ONE
ra :
$ python3.4 -m pkg.tst
Traceback (most recent call last):
  File "/usr/lib/python3.4/runpy.py", line 170, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.4/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/and/dev/test/python/imptest/pkg/tst.py", line 1, in <module>
    from pkg.subpkg import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/__init__.py", line 2, in <module>
    from pkg.subpkg.one import ONE
  File "/home/and/dev/test/python/imptest/pkg/subpkg/one.py", line 6, in <module>
    ONE = pkg.subpkg.two.TWO
AttributeError: 'module' object has no attribute 'subpkg'
ban đầu tôi đã có điều này trong one.py :
import pkg.subpkg.two as two
ONE = two.TWO
trong case đó, tôi nhận được error vào nhập khẩu (chỉ như trong dự án ban đầu của tôi mà sử dụng import as quá).

Xin vui lòng đăng nhập hoặc đăng ký để trả lời câu hỏi này.


ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...