Làm cách nào để sử dụng một gói trong Python?

Chúng tôi đã học được rằng các mô-đun là các tệp chứa các câu lệnh và định nghĩa Python, như định nghĩa hàm và lớp. Chúng ta sẽ học trong chương này cách gộp nhiều mô-đun lại với nhau để tạo thành một gói

Một gói về cơ bản là một thư mục chứa các tệp Python và một tệp có tên

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
7. py. Điều này có nghĩa là mọi thư mục bên trong đường dẫn Python chứa tệp có tên
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
7. py, sẽ được Python coi là một gói. Có thể đặt nhiều mô-đun vào một Gói

Làm cách nào để sử dụng một gói trong Python?

Các gói là một cách cấu trúc không gian tên mô-đun của Python bằng cách sử dụng "tên mô-đun chấm". Một. B là viết tắt của một mô hình con có tên B trong một gói có tên A. Hai gói khác nhau như P1 và P2 đều có thể có các mô-đun có cùng tên, chẳng hạn như A. Mô hình con A của gói P1 và mô hình con A của gói P2 có thể hoàn toàn khác nhau. Một gói được nhập giống như một mô-đun "bình thường". Chúng ta sẽ bắt đầu chương này với một ví dụ đơn giản

Đào tạo Python trực tiếp

Làm cách nào để sử dụng một gói trong Python?

Thưởng thức trang này?

Thấy. Tổng quan về các khóa học Python trực tiếp

đăng ký tại đây

Một ví dụ đơn giản

Làm cách nào để sử dụng một gói trong Python?

Chúng tôi sẽ minh họa bằng một ví dụ rất đơn giản về cách tạo một gói với một số mô-đun Python. Trước hết, chúng ta cần một thư mục. Tên của thư mục này sẽ là tên của gói mà chúng tôi muốn tạo. Chúng tôi sẽ gọi gói của chúng tôi là "simple_package". Thư mục này cần chứa một tệp có tên

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
7. py. Tệp này có thể trống hoặc có thể chứa mã Python hợp lệ. Mã này sẽ được thực thi khi một gói được nhập vào, vì vậy nó có thể được sử dụng để khởi tạo một gói, e. g. để đảm bảo rằng một số mô-đun khác được nhập hoặc một số giá trị được đặt. Bây giờ chúng ta có thể đặt tất cả các tệp Python sẽ là mô hình con của mô-đun của chúng ta vào thư mục này. Chúng tôi tạo hai tệp đơn giản a. py và b. py chỉ vì mục đích lấp đầy gói bằng các mô-đun

nội dung của một. py

def bar():
    print("Hello, function 'bar' from module 'a' calling")

Nội dung của b. py

def foo():
    print("Hello, function 'foo' from module 'b' calling")

Chúng tôi cũng sẽ thêm một tệp trống có tên

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
7. py bên trong thư mục simple_package

Hãy xem điều gì sẽ xảy ra, khi chúng ta nhập simple_package từ trình bao Python tương tác, giả sử rằng thư mục simple_package nằm trong thư mục mà bạn gọi trình bao hoặc nó được chứa trong đường dẫn tìm kiếm hoặc biến môi trường "PYTHONPATH" (từ hệ điều hành của bạn

import simple_package

simple_package/a

ĐẦU RA

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined

simple_package/b

ĐẦU RA

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
0

Chúng ta có thể thấy rằng gói Simple_package đã được tải nhưng không phải mô-đun "a" hay mô-đun "b". Chúng ta có thể nhập các mô-đun a và b theo cách sau

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
1

ĐẦU RA

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
2

Như chúng ta đã thấy ở đầu chương, chúng ta không thể truy cập cả "a" và "b" bằng cách chỉ nhập simple_package

Tuy nhiên, có một cách để tự động tải các mô-đun này. Chúng ta có thể sử dụng tệp

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
7. py cho mục đích này. Tất cả những gì chúng ta phải làm là thêm các dòng sau vào tệp trống cho đến nay
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
7. py

 

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
5

Nó sẽ hoạt động ngay bây giờ

 

def foo():
    print("Hello, function 'foo' from module 'b' calling")
0

ĐẦU RA

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
2

Gói phức tạp hơn

Chúng tôi sẽ chứng minh trong ví dụ sau cách chúng tôi có thể tạo một gói phức tạp hơn. Chúng tôi sẽ sử dụng Modul âm thanh giả định được sử dụng trong hướng dẫn chính thức. (xem https. // tài liệu. con trăn. org/3/hướng dẫn/mô-đun. html)

def foo():
    print("Hello, function 'foo' from module 'b' calling")
2

Chúng tôi sẽ triển khai một hình nộm - chỉ các tệp trống có tên phù hợp - triển khai cấu trúc này. Chúng tôi sẽ cung cấp các biến thể khác nhau của việc triển khai. Để phân biệt giữa các triển khai, chúng tôi sẽ gọi các mô-đun sound1, sound2, sound3 và sound4. Về cơ bản, tất cả chúng nên được gọi là

simple_package/b
3. Bạn có thể tải xuống các ví dụ dưới dạng tệp bzip

  • /âm thanh/âm thanh1. hắc ín. bz2
  • /âm thanh/âm thanh2. hắc ín. bz2
  • /âm thanh/âm thanh3. hắc ín. bz2
  • /âm thanh/âm thanh4. hắc ín. bz2
  • /âm thanh/âm thanh5. hắc ín. bz2
  • /âm thanh/âm thanh6. hắc ín. bz2
  • /âm thanh/âm thanh7. hắc ín. bz2

Chúng ta sẽ bắt đầu với gói

simple_package/b
4. (Bạn có thể giải nén nó bằng
simple_package/b
5)

Nếu chúng ta nhập gói

simple_package/b
4 bằng cách sử dụng câu lệnh
simple_package/b
7, thì gói
simple_package/b
4 chứ không phải các gói con
simple_package/b
9,
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
00 và
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
01 sẽ được nhập, như chúng ta sẽ thấy trong ví dụ sau. Lý do cho điều này bao gồm thực tế là tệp
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
02 không chứa bất kỳ mã nào để nhập các gói con

def foo():
    print("Hello, function 'foo' from module 'b' calling")
3

ĐẦU RA

def foo():
    print("Hello, function 'foo' from module 'b' calling")
4

Nếu bạn cũng muốn sử dụng các hiệu ứng gói, bạn phải nhập nó một cách rõ ràng với âm thanh nhập. các hiệu ứng

def foo():
    print("Hello, function 'foo' from module 'b' calling")
5

ĐẦU RA

def foo():
    print("Hello, function 'foo' from module 'b' calling")
6

Có thể tự động nhập mô-đun con khi nhập mô-đun

simple_package/b
4. Bây giờ chúng tôi sẽ thay đổi thành
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
04 để minh họa cách thực hiện việc này. Chúng tôi sử dụng các tệp tương tự như trong
simple_package/b
4, nhưng chúng tôi sẽ thêm dòng mã
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
06 vào tệp
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
02 của thư mục
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
04. Các tập tin sẽ trông như thế này bây giờ

def foo():
    print("Hello, function 'foo' from module 'b' calling")
7

Nếu chúng tôi nhập gói

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
04 từ trình bao Python tương tác, chúng tôi sẽ thấy rằng gói con
simple_package/b
9 cũng sẽ được tải tự động

def foo():
    print("Hello, function 'foo' from module 'b' calling")
8

ĐẦU RA

def foo():
    print("Hello, function 'foo' from module 'b' calling")
9

Thay vì sử dụng một đường dẫn tuyệt đối, chúng ta có thể đã nhập gói hiệu ứng tương ứng với gói âm thanh

import simple_package
0

Chúng tôi sẽ chứng minh điều này trong mô-đun

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
11

import simple_package
1

ĐẦU RA

import simple_package
2

Cũng có thể tự động nhập các định dạng gói, khi chúng tôi đang nhập gói hiệu ứng. Chúng tôi cũng có thể làm điều này với một đường dẫn tương đối, mà chúng tôi sẽ đưa vào tệp

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
02 của thư mục
simple_package/b
9

import simple_package
3

Nhập

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
14 cũng sẽ tự động nhập các mô-đun
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
01 và
simple_package/b
9

nhập âm thanh4

Để kết thúc chương này, chúng tôi muốn trình bày cách nhập mô-đun karaoke từ gói bộ lọc khi chúng tôi nhập gói hiệu ứng. Với mục đích này, chúng tôi thêm dòng từ. bộ lọc nhập karaoke vào tệp

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
02 của thư mục hiệu ứng. Các tập tin hoàn chỉnh bây giờ trông như thế này

import simple_package
4

Nhập kết quả âm thanh trong đầu ra sau

import simple_package
5

ĐẦU RA

import simple_package
6

Bây giờ chúng ta có thể truy cập và sử dụng các chức năng của karaoke

import simple_package
7

ĐẦU RA

import simple_package
8

Đào tạo Python trực tiếp

Làm cách nào để sử dụng một gói trong Python?

Thưởng thức trang này?

Thấy. Tổng quan về các khóa học Python trực tiếp

Các khóa học trực tuyến sắp tới

Khái niệm cơ bản về Python cho người mới bắt đầu

Khóa học nâng cao chuyên sâu

Python dành cho kỹ sư và nhà khoa học

Lập trình hướng đối tượng với Python

đăng ký tại đây

Nhập một gói hoàn chỉnh

Đối với chương phụ tiếp theo, chúng tôi sẽ sử dụng lại ví dụ ban đầu từ chương phụ trước của hướng dẫn của chúng tôi. Chúng tôi sẽ thêm một mô-đun (tệp) foobar (tên tệp.

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
18) vào thư mục âm thanh. Có thể tải xuống lại gói hoàn chỉnh dưới dạng tệp bzip. Bây giờ chúng tôi muốn chứng minh điều gì sẽ xảy ra nếu chúng tôi nhập gói âm thanh có dấu sao, tôi. e.
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
19. Ai đó có thể muốn nhập theo cách này tất cả các mô hình con và gói con của gói. Hãy xem điều gì sẽ xảy ra

import simple_package
9

ĐẦU RA

simple_package/a
0

Vì vậy, chúng tôi nhận được thông báo an ủi rằng gói âm thanh đã được nhập. Tuy nhiên, nếu chúng ta kiểm tra với dir chức năng, chúng ta sẽ thấy rằng cả mô-đun foobar cũng như các hiệu ứng, bộ lọc và định dạng gói con đều chưa được nhập

simple_package/a
1

ĐẦU RA

simple_package/a
2

Python cung cấp một cơ chế để đưa ra một chỉ mục rõ ràng về các gói con và mô-đun của gói, nên được nhập. Với mục đích này, chúng ta có thể định nghĩa một danh sách có tên là

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
20. Danh sách này sẽ được lấy làm danh sách các tên mô-đun và gói được nhập khi gặp phải nhập từ gói *

Bây giờ chúng ta sẽ thêm dòng

simple_package/a
3

đến

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
7. tập tin py của thư mục âm thanh. Bây giờ chúng tôi nhận được một kết quả hoàn toàn khác

simple_package/a
4

ĐẦU RA

simple_package/a
5

Mặc dù rõ ràng là tất cả các mô-đun đã được nhập, chúng ta có thể kiểm tra lại dir

simple_package/a
1

ĐẦU RA

simple_package/a
7

Câu hỏi tiếp theo là cái gì sẽ được nhập, nếu chúng ta sử dụng * trong gói con

simple_package/a
8

Như mong đợi, các mô-đun bên trong hiệu ứng chưa được nhập tự động. Vì vậy, chúng tôi có thể thêm danh sách

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
20 sau vào tệp
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
7 của các hiệu ứng gói

Chúng ta phải thêm vào các tệp

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
02 của các thư mục
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
00,
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
01 và
simple_package/b
9 tương ứng các dòng mã sau

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
28

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
29

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
50

Bây giờ chúng tôi nhận được kết quả mong muốn

simple_package/a
9

ĐẦU RA

simple_package/a
5

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
1

ĐẦU RA

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
2

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
3

ĐẦU RA

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
4

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
5

ĐẦU RA

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in 
----> 1 simple_package/a
NameError: name 'a' is not defined
6

Mặc dù một số mô-đun nhất định được thiết kế để chỉ xuất các tên tuân theo các mẫu nhất định khi bạn sử dụng nhập, nhưng nó vẫn được coi là thông lệ không tốt. Cách được khuyến nghị là nhập các mô-đun cụ thể từ một gói thay vì sử dụng