Tôi đang bối rối bởi cách nhập khẩu vòng tròn được xử lý bằng Python. Tôi đã cố gắng để chưng cất một câu hỏi tối thiểu và tôi không nghĩ rằng biến thể chính xác này đã được hỏi trước đây. Về cơ bản, tôi nhìn thấy một sự khác biệt giữaSự khác biệt giữa "import lib.foo" và "import lib.foo as f" trong Python
import lib.foo
và
import lib.foo as f
khi tôi có một phụ thuộc vòng tròn giữa lib.foo
và lib.bar
. Tôi đã mong đợi rằng cả hai sẽ làm việc giống nhau: mô-đun (có thể được khởi tạo một nửa) sẽ được tìm thấy trong sys.modules
và được đưa vào không gian tên cục bộ. (Từ thử nghiệm tôi nhận thấy rằng import lib.foo
thực sự đặt lib
vào không gian tên địa phương -. Okay, với cú pháp mà tôi sẽ làm lib.foo.something
anyway)
Tuy nhiên, nếu lib.foo
là đã có trong sys.modules
, sau đó import lib.foo as f
cố gắng truy cập foo
như một thuộc tính trên lib
và tăng AttributeError. Tại sao hành vi (dường như) phụ thuộc vào sự hiện diện trong sys.modules
?
Ngoài ra, hành vi này được ghi lại ở đâu? Tôi không cảm thấy rằng các Python import
statement reference giải thích hành vi này, hoặc ít nhất tôi không thể giải nén nó :-)
Tất cả trong tất cả Tôi đang cố gắng thay đổi mã cơ sở để sử dụng kiểu oft recommended nơi bạn nhập mô-đun, không phải biểu tượng trong các mô-đun:
from project.package import moduleA
from project.package import moduleB
Nhưng điều đó không thành công khi có nhập khẩu vòng tròn giữa hai mô-đun. Tôi đã mong đợi nó hoạt động miễn là các định nghĩa cấp cao nhất trong hai mô-đun không phụ thuộc vào nhau (ví dụ: không có lớp con trong moduleB
với lớp cơ sở trong moduleA
).
thử nghiệm kịch bản:
#!/bin/sh
rm -r lib; mkdir lib
touch lib/__init__.py
cat > lib/foo.py <<EOF
# lib.foo module
print '{ foo'
#import lib.bar # works
import lib.bar as b # also works
#from lib import bar # also works
print 'foo }'
EOF
cat > lib/bar.py <<EOF
# lib.bar module
print '{ bar'
#import lib.foo # works
import lib.foo as f # AttributeError: 'module' object has no attribute 'foo'
#from lib import foo # ImportError: cannot import name foo
print 'bar }'
EOF
python -c 'import lib.foo'
Liên kết http://google-styleguide.googlecode.com/svn/trunk/pyguide.html?showone=Imports#Imports bị hỏng - sẽ rất thú vị khi thêm lại –