Gói Python chỉ đơn giản là một tập hợp các mô-đun python có tổ chức. Mô-đun python chỉ đơn giản là một tệp python
Tại sao tôi muốn tạo một gói bằng cách sử dụng __init__.py
?
Tạo một gói với __init__.py
là để giúp phát triển các dự án Python lớn hơn dễ dàng hơn
Nó cung cấp một cơ chế để bạn nhóm các tập lệnh python riêng biệt thành một mô-đun có thể nhập được
Hãy chạy qua một số ví dụ
Cách tốt nhất để hiểu tại sao bạn sẽ sử dụng __init__.py
và để tìm hiểu cách sử dụng nó để tạo một gói là chạy qua một số ví dụ nhanh. Cách tốt nhất để học là làm
Mã trong hướng dẫn này sẽ hoạt động với Python 2 hoặc 3. Chỉ cần nhớ, nếu bạn đang sử dụng 2 thì bạn sẽ cần sử dụng chức năng
# stringLength.py def stringLength[inStr]: return len[inStr]2
Giả sử chúng tôi có ba mô-đun chúng tôi đã tạo
someFolder |-- stringLength.py |-- stringToUpper.py `-- stringToLower.py
Hãy nhớ rằng một mô-đun chỉ là một tên khác cho bất kỳ tệp python nào
Ví dụ của chúng tôi, nội dung của các tệp này là như sau
# stringLength.py def stringLength[inStr]: return len[inStr]
# stringToUpper.py def stringToUpper[inStr]: return inStr.upper[]
# stringToLower.py def stringToLower[inStr]: return inStr.lower[]
Rõ ràng, các chức năng này là vô dụng, nhưng nó giúp phục vụ như một mô hình cho khái niệm cơ bản rằng chúng ta có một số mô-đun python mà chúng ta đã viết có liên quan đến nhau.
Vì vậy, nếu không tạo gói và sử dụng __init__.py
, làm cách nào để sử dụng các chức năng trong các tệp này?
Chà, chúng tôi chỉ có thể nhập các tệp này nếu chúng nằm trong thư mục hiện tại mà bất kỳ tập lệnh nào chúng tôi đang chạy đều chạy từ đó
Chà, chúng ta có thể sử dụng các tệp này trong tập lệnh Python mới nhưng với một cảnh báo chính
- Các tệp phải nằm trong cùng thư mục với tập lệnh mà chúng tôi đang cố gắng sử dụng chúng trong
Để minh họa điều đó, hãy tạo một tệp có tên
# stringLength.py def stringLength[inStr]: return len[inStr]4 tận dụng các mô-đun của chúng tôi
# example1.py import stringLength import stringToLower import stringToUpper some_string = "Hello, Universe!" print[stringLength.stringLength[some_string]] print[stringToLower.stringToLower[some_string]] print[stringToUpper.stringToUpper[some_string]]
Thêm một khoảng trống __init__.py
Điều gì sẽ xảy ra nếu chúng ta muốn tách các tập lệnh này thành một thư mục để sắp xếp chúng ngăn nắp hơn?
Chà, đó là lúc tệp __init__.py
phát huy tác dụng
Trước tiên, hãy di chuyển các tập lệnh của chúng ta vào một thư mục con mới và gọi nó là.
# stringLength.py def stringLength[inStr]: return len[inStr]7. Sau đó, tạo một tệp trống trong thư mục đó có tên là
__init__.py
Đây là cấu trúc tệp/thư mục mới của chúng tôi
________số 8_______
Vì vậy, bây giờ hãy kiểm tra chính xác những gì __init__.py
cho phép chúng tôi làm
Hãy tạo một tệp
# stringToUpper.py def stringToUpper[inStr]: return inStr.upper[]0 mới
# example2.py import string_func.stringLength import string_func.stringToLower import string_func.stringToUpper some_string = "Hello, Universe!" print[string_func.stringLength.stringLength[some_string]] print[string_func.stringToLower.stringToLower[some_string]] print[string_func.stringToUpper.stringToUpper[some_string]]
Vì vậy, bây giờ chúng ta có thể truy cập các hàm chuỗi của mình theo cách này. Điều này thật tuyệt, vì tất cả chúng đều nằm trong một thư mục riêng biệt, nhưng cú pháp chắc chắn không ngắn gọn lắm. Hãy xem liệu chúng ta có thể dọn dẹp mọi thứ một chút bằng cách chỉnh sửa tệp __init__.py
của mình không
Thêm nhập vào init. py
Mở tệp __init__.py
của bạn và thực hiện các thay đổi sau
# __init__.py from .stringLength import stringLength from .stringToLower import stringToLower from .stringToUpper import stringToUpper
Lưu ý rằng
# stringToUpper.py def stringToUpper[inStr]: return inStr.upper[]3 trước tên mô-đun là không cần thiết kể từ Python 3 vì nó nghiêm ngặt hơn đối với việc nhập tương đối. https. // stackoverflow. com/questions/12172791/changes-in-import-statement-python3?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
Và vì vậy với điều đó trong __init__.py
của chúng tôi, giờ đây chúng tôi có thể rút ngắn mã của mình thành
# example3.py import string_func some_string = "Hello, Universe!" print[string_func.stringLength[some_string]] print[string_func.stringToLower[some_string]] print[string_func.stringToUpper[some_string]]
Bây giờ cú pháp ngắn hơn rất nhiều và bạn có thể thấy rằng
# stringLength.py def stringLength[inStr]: return len[inStr]7 đang hoạt động giống như mô-đun của chính nó
Vì vậy, về cơ bản đó là những gì __init__.py
làm. Nó cho phép bạn xử lý một thư mục như thể nó là một mô-đun python. Sau đó, bạn có thể xác định thêm nội dung nhập bên trong tệp __init__.py
của mình để thực hiện quá trình nhập ngắn gọn hơn hoặc bạn chỉ cần để trống tệp
Gỡ lỗi # stringToUpper.py
def stringToUpper[inStr]:
return inStr.upper[]
8 Vấn đề
Về cơ bản, có 3 mẹo tôi có để gỡ lỗi các sự cố nhập
Sử dụng trình thông dịch tương tác [REPL] để nhập các mô-đun và xem bạn có nhận được những gì bạn mong đợi không
Bắt đầu tập lệnh của bạn với
# stringToUpper.py def stringToUpper[inStr]: return inStr.upper[]
9 và sau đó kiểm tra đầu ra để xem chính xác nơi các mô-đun của bạn được nhập từ đâuSử dụng Pycharm. Khả năng xem xét nội tâm tuyệt vời của Pycharm có nghĩa là bạn sẽ biết ngay liệu mô-đun của mình có được nhập đúng cách hay không vì nó sẽ báo lỗi nếu không. Đôi khi nó cũng sẽ đề xuất sự điều chỉnh thích hợp. Phiên bản cộng đồng là miễn phí và nếu bạn là sinh viên, bạn có thể đăng ký miễn phí TẤT CẢ các sản phẩm của họ
Để biết thêm thông tin về các gói và mô-đun python, bạn có thể xem kiểm tra tài liệu về python trên đó
Bạn cũng có thể xem podcast Talk Python To Me tuyệt vời này với David Beazley, nơi anh ấy thảo luận về chủ đề này, cũng như bài nói chuyện của David về cùng chủ đề