Giả sử cấu trúc mã sau:Tại sao hai nhập khẩu Python này hoạt động khác nhau?
#### 1/hhh/__init__.py: empty
#### 1/hhh/foo/__init__.py:
from hhh.foo.baz import *
#### 1/hhh/foo/bar.py:
xyzzy = 4
#### 1/hhh/foo/baz.py:
import hhh.foo.bar as bar
qux = bar.xyzzy + 10
tôi chạy python
bên 1/
và làm import hhh.foo.baz
. Nó không thành công:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "hhh/foo/__init__.py", line 1, in <module>
from hhh.foo.baz import *
File "hhh/foo/baz.py", line 1, in <module>
import hhh.foo.bar as bar
AttributeError: 'module' object has no attribute 'foo'
Bây giờ tôi thay thế baz.py
với:
# 1/hhh/foo/baz.py:
from hhh.foo.bar import xyzzy
qux = xyzzy + 10
và một lần nữa làm import hhh.foo.baz
. Bây giờ nó hoạt động, mặc dù tôi đang tải cùng một mô-đun, chỉ gắn một tên khác.
Điều này có nghĩa là sự khác biệt giữa import module
và from module import name
không chỉ là số nhận dạng? Chính xác thì chuyện gì đang xảy ra ở đây vậy?
(Tôi biết tôi có thể sử dụng hàng nhập khẩu liên quan đến làm việc xung quanh tất cả điều này, nhưng tôi vẫn muốn hiểu được cơ chế. Ngoài ra tôi không thích nhập khẩu tương đối, và cũng như thế PEP 8.)
Phải, do đó, có sự khác biệt về ngữ nghĩa. Cảm ơn! –