Nhập tương đối xảy ra bất cứ khi nào bạn đang nhập một gói liên quan đến tập lệnh / gói hiện tại.
Hãy xem xét cây sau đây chẳng hạn:
mypkg
├── base.py
└── derived.py
Bây giờ, derived.py
yêu cầu của bạn một cái gì đó từ base.py
. Trong Python 2, bạn có thể làm như thế này (trong derived.py
):
from base import BaseThing
Python 3 không còn hỗ trợ điều đó vì nó không rõ ràng cho dù bạn muốn 'tương đối' hay 'tuyệt đối' base
. Nói cách khác, nếu có một gói Python có tên base
được cài đặt trong hệ thống, bạn sẽ nhận được gói sai.
Thay vào đó, nó yêu cầu bạn sử dụng nhập khẩu rõ ràng, chỉ định rõ ràng vị trí của mô-đun trên cơ sở giống nhau. Bạn derived.py
sẽ trông như thế nào:
from .base import BaseThing
Hàng đầu .
nói 'nhập base
từ thư mục mô-đun'; nói cách khác, .base
bản đồ đến ./base.py
.
Tương tự, có ..
tiền tố đi lên phân cấp thư mục như ../
(với ..mod
ánh xạ tới ../mod.py
), và sau đó ...
tăng hai cấp độ (../../mod.py
) và cứ thế.
Tuy nhiên, xin lưu ý rằng các đường dẫn tương đối được liệt kê ở trên có liên quan đến thư mục chứa mô-đun hiện tại ( derived.py
) chứ không phải thư mục làm việc hiện tại.
@BrenBarn đã giải thích trường hợp nhập sao. Để hoàn thiện, tôi sẽ phải nói như vậy;).
Ví dụ, bạn cần sử dụng một vài math
chức năng nhưng bạn chỉ sử dụng chúng trong một chức năng duy nhất. Trong Python 2, bạn được phép bán lười biếng:
def sin_degrees(x):
from math import *
return sin(degrees(x))
Lưu ý rằng nó đã kích hoạt cảnh báo trong Python 2:
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
Trong mã Python 2 hiện đại, bạn nên và trong Python 3, bạn phải thực hiện:
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
hoặc là:
from math import *
def sin_degrees(x):
return sin(degrees(x))