Python tăng tốc nhập khẩu

Giống như các bài viết? . Python đơn giản đã chết của Jason C. McDonald có sẵn từ No Starch Press

Phần tồi tệ nhất của hướng dẫn luôn là sự đơn giản của chúng, phải không?

Tôi nhận thấy rằng việc cấu trúc một dự án Python là một trong những thành phần thường bị bỏ qua nhất khi dạy ngôn ngữ này. Tệ hơn nữa, nhiều nhà phát triển đã mắc sai lầm, vấp phải một mớ lỗi phổ biến cho đến khi họ tìm ra thứ ít nhất hoạt động được.

Đây là tin tốt. bạn không cần phải là một trong số họ

Trong phần này của loạt bài Dead Simple Python, chúng ta sẽ khám phá

import re
5 câu lệnh, mô-đun, gói và cách khớp mọi thứ lại với nhau mà không làm bạn rối tóc. Chúng tôi thậm chí sẽ đề cập đến VCS, PEP và Zen of Python. Thắt dây an toàn

Thiết lập kho lưu trữ

Trước khi chúng tôi đi sâu vào cấu trúc dự án thực tế, hãy giải quyết cách nó phù hợp với Hệ thống kiểm soát phiên bản [VCS] của chúng tôi. bắt đầu với thực tế là bạn cần một VCS. Một vài lý do là

  • Theo dõi mọi thay đổi bạn thực hiện,
  • Tìm ra chính xác khi bạn phá vỡ một cái gì đó,
  • Có thể xem các phiên bản cũ của mã của bạn,
  • Sao lưu mã của bạn và
  • Cộng tác với những người khác

Bạn đã có rất nhiều lựa chọn có sẵn cho bạn. Git là rõ ràng nhất, đặc biệt nếu bạn không biết sử dụng cái gì khác. Bạn có thể lưu trữ miễn phí kho lưu trữ Git của mình trên GitHub, GitLab, Bitbucket hoặc Gitote, trong số những thứ khác. Nếu bạn muốn thứ gì khác ngoài Git, thì có hàng tá tùy chọn khác, bao gồm Mercurial, Bazaar, Subversion [mặc dù nếu bạn sử dụng cái cuối cùng đó, có thể bạn sẽ bị đồng nghiệp coi là khủng long. ]

Tôi sẽ lặng lẽ cho rằng bạn đang sử dụng Git cho phần còn lại của hướng dẫn này, vì đó là những gì tôi chỉ sử dụng

Khi bạn đã tạo kho lưu trữ của mình và sao chép một bản sao cục bộ vào máy tính của mình, bạn có thể bắt đầu thiết lập dự án của mình. Tối thiểu, bạn sẽ cần tạo những thứ sau

  • import re
    
    6. Mô tả về dự án của bạn và mục tiêu của nó
  • import re
    
    7. Giấy phép dự án của bạn, nếu nó là mã nguồn mở. [Xem mã nguồn mở. org để biết thêm thông tin về cách chọn một. ]
  • import re
    
    8. Một tệp đặc biệt cho Git biết những tệp và thư mục nào cần bỏ qua. [Nếu bạn đang sử dụng VCS khác, tệp này có tên khác. Tìm kiếm. ]
  • Một thư mục có tên dự án của bạn

Đúng rồi. các tệp mã Python của chúng tôi thực sự thuộc về một thư mục con riêng biệt. Điều này rất quan trọng, vì thư mục gốc của kho lưu trữ của chúng ta sẽ trở nên lộn xộn với các tệp xây dựng, tập lệnh đóng gói, môi trường ảo và tất cả những thứ khác không thực sự là một phần của mã nguồn

Ví dụ, chúng tôi sẽ gọi dự án hư cấu của chúng tôi là

import re
9

PEP 8 và đặt tên

Phong cách Python được điều chỉnh phần lớn bởi một bộ tài liệu có tên là Đề xuất cải tiến Python, viết tắt là PEP. Tất nhiên, không phải tất cả các PEP đều được thông qua - đó là lý do tại sao chúng được gọi là "Đề xuất" - nhưng một số. Bạn có thể duyệt qua chỉ mục PEP chính trên trang web chính thức của Python. Chỉ số này chính thức được gọi là PEP 0

Ngay bây giờ, chúng tôi chủ yếu quan tâm đến PEP 8, lần đầu tiên được tác giả bởi người tạo ngôn ngữ Python Guido van Rossum vào năm 2001. Đây là tài liệu phác thảo chính thức phong cách mã hóa mà tất cả các nhà phát triển Python thường nên tuân theo. Giữ nó dưới gối của bạn. Học nó, làm theo nó, khuyến khích người khác làm như vậy

[Ghi chú bên lề. PEP 8 đưa ra quan điểm rằng luôn có ngoại lệ đối với quy tắc kiểu. Đó là một hướng dẫn, không phải là một nhiệm vụ. ]

Ngay bây giờ, chúng tôi chủ yếu quan tâm đến phần có tiêu đề "Tên gói và mô-đun"

Các mô-đun nên có tên ngắn, toàn chữ thường. Dấu gạch dưới có thể được sử dụng trong tên mô-đun nếu nó cải thiện khả năng đọc. Các gói Python cũng phải có tên ngắn, viết thường, mặc dù việc sử dụng dấu gạch dưới không được khuyến khích

Chúng ta sẽ tìm hiểu chính xác các mô-đun và gói là gì trong giây lát, nhưng hiện tại, hãy hiểu rằng các mô-đun được đặt tên theo tên tệp và các gói được đặt tên theo tên thư mục của chúng

Nói cách khác, tên tệp phải là chữ thường, có dấu gạch dưới nếu điều đó cải thiện khả năng đọc. Tương tự, tên thư mục phải là chữ thường, không có dấu gạch dưới nếu có thể tránh được. Nói cách khác

  • Làm cái này.
    # smart_door.py
    def close[]:
        print["Ahhhhhhhhhhhh."]
    
    def open[]:
        print["Thank you for making a simple door very happy."]
    
    0
  • Không phải cái này.
    # smart_door.py
    def close[]:
        print["Ahhhhhhhhhhhh."]
    
    def open[]:
        print["Thank you for making a simple door very happy."]
    
    1

Tôi biết, tôi biết, cách dài dòng để đưa ra quan điểm, nhưng ít nhất tôi đã đặt một chút PEP vào bước của bạn. [Xin chào? Cái này có bật không?]

Gói và Mô-đun

Điều này sẽ khiến bạn cảm thấy khó chịu, nhưng đây là những định nghĩa đã được hứa hẹn

Bất kỳ tệp Python [_______52] nào cũng là một mô-đun và một loạt các mô-đun trong một thư mục là một gói

Tốt. hầu hết. Có một việc khác mà bạn phải làm với một thư mục để biến nó thành một gói, đó là dán một tệp có tên

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
3 vào đó. Bạn thực sự không cần phải đặt bất cứ thứ gì vào tập tin đó. Nó chỉ cần ở đó

Có những thứ thú vị khác mà bạn có thể làm với

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
3, nhưng nó nằm ngoài phạm vi của hướng dẫn này, vì vậy hãy đọc tài liệu để tìm hiểu thêm

Nếu bạn quên

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
3 trong gói của mình, thì nó sẽ làm điều gì đó kỳ lạ hơn là chỉ thất bại, bởi vì điều đó làm cho nó trở thành một gói không gian tên ẩn. Có một số điều tiện lợi mà bạn có thể làm với loại gói đặc biệt đó, nhưng tôi sẽ không đi sâu vào vấn đề đó ở đây. Như thường lệ, bạn có thể tìm hiểu thêm bằng cách đọc tài liệu. PEP 420. Gói không gian tên tiềm ẩn

Vì vậy, nếu chúng ta nhìn vào cấu trúc dự án của mình, thì

import re
9 thực sự là một gói và nó có thể chứa các gói khác. Do đó, chúng tôi có thể gọi ____09 gói cấp cao nhất của chúng tôi và tất cả các gói bên dưới các gói con của nó. Điều này sẽ thực sự quan trọng khi chúng ta bắt đầu nhập nội dung

Hãy xem một ảnh chụp nhanh các dự án trong thế giới thực của tôi,

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
8, để biết cách chúng tôi cấu trúc các thứ

import re
4

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

[Trong trường hợp bạn đang thắc mắc, tôi đã sử dụng chương trình UNIX

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
9 để tạo sơ đồ nhỏ ở trên. ]

Bạn sẽ thấy rằng tôi có một gói cấp cao nhất có tên là

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
8, với bốn gói phụ.
import re
71,
import re
72,
import re
73 và
import re
74. Tôi cũng có thư mục
import re
75, nhưng thư mục đó chỉ chứa âm thanh, hình ảnh của trò chơi, v.v. [bỏ qua ở đây cho ngắn gọn].
import re
75 KHÔNG phải là một gói vì nó không chứa một
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
3

Tôi cũng có một tệp đặc biệt khác trong gói cấp cao nhất của mình.

import re
78. Đây là tệp được chạy khi chúng tôi thực thi gói cấp cao nhất của mình trực tiếp qua
import re
79. Lát nữa chúng ta sẽ nói về những gì diễn ra trong
import re
78 đó

Cách nhập hoạt động

Nếu bạn đã từng viết bất kỳ mã Python có ý nghĩa nào trước đây, thì gần như chắc chắn bạn đã quen thuộc với câu lệnh

import re
5. Ví dụ

import re

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Thật hữu ích khi biết rằng, khi chúng tôi nhập một mô-đun, chúng tôi thực sự đang chạy nó. Điều này có nghĩa là bất kỳ câu lệnh

import re
5 nào trong mô-đun cũng đang được chạy

Ví dụ:

import re
03 có một số câu lệnh nhập của riêng nó, được thực thi khi chúng ta nói
import re
04. Điều đó không có nghĩa là chúng có sẵn cho tệp mà chúng tôi đã nhập
import re
05 từ đó, nhưng điều đó có nghĩa là những tệp đó phải tồn tại. Nếu [vì một số lý do không chắc chắn]
import re
06 đã bị xóa trên môi trường của bạn và bạn đã chạy
import re
04, nó sẽ không thành công với lỗi

Traceback [cuộc gọi gần đây nhất gần đây nhất].
Tệp "lạ. py", dòng 1, trong
nhập lại
Tệp "lại. py", dòng 122, trong
nhập enum
ModuleNotFoundError. Không có mô-đun nào có tên 'enum'

Đương nhiên, đọc đến đây, bạn có thể hơi bối rối. Tôi đã có người hỏi tôi tại sao không thể tìm thấy mô-đun bên ngoài [trong ví dụ này là

import re
05]. Những người khác thắc mắc tại sao mô-đun bên trong [
import re
09 ở đây] lại được nhập vào, vì họ không yêu cầu trực tiếp trong mã của mình. Đáp án đơn giản. chúng tôi đã nhập
import re
05 và nhập khẩu đó
import re
09

Tất nhiên, kịch bản trên là hư cấu.

import re
92 và
import re
04 sẽ không bao giờ bị lỗi trong các trường hợp bình thường, bởi vì cả hai mô-đun đều là một phần của thư viện cốt lõi của Python. Đó chỉ là một ví dụ ngớ ngẩn. ;]

Nhập khẩu Nên và Không nên

Thực tế có một số cách nhập, nhưng hầu hết chúng hiếm khi được sử dụng.

Đối với tất cả các ví dụ bên dưới, chúng tôi sẽ tưởng tượng rằng chúng tôi có một tệp có tên là

import re
94

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Ví dụ: chúng tôi sẽ chạy phần còn lại của mã trong phần này trong trình bao tương tác Python, từ cùng thư mục với

import re
94

Nếu chúng tôi muốn chạy chức năng

import re
96, trước tiên chúng tôi phải nhập mô-đun
import re
97. Cách dễ nhất để làm điều này là

import re
7

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Chúng tôi thực sự sẽ nói rằng

import re
97 là không gian tên của
import re
96 và
import re
90. Các nhà phát triển Python thực sự thích các không gian tên, bởi vì chúng làm cho nó rõ ràng các chức năng đến từ đâu và không có gì.

[Nhân tiện, đừng nhầm lẫn không gian tên với gói không gian tên ẩn. Chúng là hai thứ khác nhau. ]

Zen of Python, còn được gọi là PEP 20, xác định triết lý đằng sau ngôn ngữ Python. Dòng cuối cùng có một tuyên bố giải quyết vấn đề này

Không gian tên là một ý tưởng tuyệt vời -- hãy làm nhiều hơn thế nữa

Tuy nhiên, tại một thời điểm nhất định, các không gian tên có thể trở thành một vấn đề khó khăn, đặc biệt là với các gói lồng nhau.

import re
91 thật xấu xí. Rất may, chúng tôi có một cách xung quanh việc phải sử dụng không gian tên mỗi khi chúng tôi gọi hàm

Nếu chúng ta muốn có thể sử dụng hàm

import re
96 mà không cần phải liên tục đặt trước tên mô-đun của nó, chúng ta có thể làm điều này thay thế

import re
0

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Tuy nhiên, xin lưu ý rằng cả

import re
90 và
import re
94 đều không hoạt động trong trường hợp cuối cùng đó, bởi vì chúng tôi đã không nhập hàm hoàn toàn. Để sử dụng nó, chúng tôi phải thay đổi mã này

import re
9

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Trong cơn ác mộng lồng nhau khủng khiếp trước đó, bây giờ chúng ta có thể nói

import re
95, và sau đó chỉ cần sử dụng trực tiếp
import re
96. Ngoài ra, nếu chúng tôi muốn một chút không gian tên, chúng tôi có thể nói
import re
97 và nói
import re
98

Hệ thống

import re
5 ngon dẻo như thế

Tuy nhiên, chẳng bao lâu sau, bạn có thể sẽ thấy mình nói "Nhưng tôi có hàng trăm chức năng trong mô-đun của mình và tôi muốn sử dụng tất cả chúng. " Đây là thời điểm mà nhiều nhà phát triển đi chệch hướng khi làm điều này

import re
9

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Điều này rất, rất tệ. Nói một cách đơn giản, nó nhập trực tiếp mọi thứ trong mô-đun và đó là một vấn đề. Hãy tưởng tượng đoạn mã sau

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
2

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Bạn nghĩ điều gì sẽ xảy ra? .

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
22 đã bị che khuất - chúng tôi không thể gọi nó là
import re
96, điều đó có nghĩa là chúng tôi hoàn toàn không thể gọi nó

Tất nhiên, vì chúng ta thường không biết, hoặc ít nhất là không nhớ, từng chức năng, lớp và biến trong mọi mô-đun được nhập, nên chúng ta có thể dễ dàng kết thúc với rất nhiều mớ hỗn độn.

Zen of Python cũng giải quyết tình huống này

Rõ ràng là tốt hơn ngầm

Bạn không bao giờ phải đoán xem hàm hoặc biến đến từ đâu. Một nơi nào đó trong tệp phải là mã cho chúng tôi biết rõ ràng nó đến từ đâu. Hai kịch bản đầu tiên chứng minh rằng

Tôi cũng nên đề cập rằng kịch bản

import re
91 trước đó là điều mà các nhà phát triển Python KHÔNG muốn thấy. Cũng từ Thiền của Python

Căn hộ tốt hơn lồng nhau

Một số gói lồng vào nhau thì không sao, nhưng khi dự án của bạn bắt đầu trông giống như một bộ búp bê Matryoshka phức tạp, thì bạn đã làm sai điều gì đó. Sắp xếp các mô-đun của bạn thành các gói, nhưng giữ cho nó đơn giản hợp lý

Nhập trong dự án của bạn

Cấu trúc tệp dự án mà chúng tôi đã tạo trước đó sắp trở nên rất hữu ích. Nhớ lại dự án

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
8 của tôi

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
9

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Trong mô-đun

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
26 của tôi, được xác định bởi
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
27, tôi muốn sử dụng lớp
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
28 của mình. Lớp đó được định nghĩa trong
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
29. Làm thế nào để tôi có được nó?

Bởi vì tôi đã định nghĩa

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
8 là một gói và tổ chức các mô-đun của mình thành các gói con, nên nó thực sự khá dễ dàng. Trong
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
91, tôi nói

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
6

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Điều này được gọi là nhập khẩu tuyệt đối. Nó bắt đầu ở gói cấp cao nhất,

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
8, và đi xuống gói
import re
71, nơi nó tìm kiếm
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
94

Một số nhà phát triển đến gặp tôi với các câu lệnh nhập giống như

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
95 hơn và tự hỏi tại sao nó không hoạt động. Nói một cách đơn giản, gói
import re
72 [nơi
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
91 sống] không biết gì về các gói anh chị em của nó

Nó, tuy nhiên, biết về cha mẹ của nó. Do đó, Python có một thứ gọi là nhập tương đối cho phép chúng ta làm điều tương tự như thế này thay vì

import re
0

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
98 có nghĩa là "gói mẹ trực tiếp của gói này", trong trường hợp này là
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
8. Vì vậy, quá trình nhập lùi lại một cấp, đi xuống
import re
71 và tìm thấy
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
94

Có rất nhiều tranh luận về việc nên sử dụng nhập khẩu tuyệt đối hay tương đối. Cá nhân tôi thích sử dụng nhập khẩu tuyệt đối bất cứ khi nào có thể, bởi vì nó làm cho mã dễ đọc hơn rất nhiều. Bạn có thể tự quyết định, tuy nhiên. Phần quan trọng duy nhất là kết quả là hiển nhiên - không nên có bí ẩn về nguồn gốc của bất kỳ thứ gì

[Đọc Tiếp. Real Python - Nhập khẩu tuyệt đối và tương đối trong Python

Có một gotcha ẩn nấp khác ở đây. Trong

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
62, tôi có dòng này

import re
1

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Chắc chắn, vì cả hai mô-đun này nằm trong cùng một gói, nên chúng ta có thể chỉ cần nói

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
63, phải không?

Sai. Nó thực sự sẽ không xác định được vị trí của

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
91. Điều này là do chúng tôi đang chạy gói cấp cao nhất
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
8, có nghĩa là đường dẫn tìm kiếm [nơi Python tìm kiếm các mô-đun và theo thứ tự nào] hoạt động khác

Tuy nhiên, chúng ta có thể sử dụng nhập tương đối để thay thế

import re
2

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Trong trường hợp đó,

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
66 duy nhất có nghĩa là "gói này"

Nếu bạn đã quen thuộc với hệ thống tệp UNIX điển hình, điều này sẽ bắt đầu có ý nghĩa.

# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
98 có nghĩa là "lùi một cấp" và
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
66 có nghĩa là "vị trí hiện tại". Tất nhiên, Python tiến thêm một bước.
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
69 có nghĩa là "lùi hai cấp",
import re
00 là "lùi ba cấp", v.v.

Tuy nhiên, hãy nhớ rằng những "cấp độ" đó không chỉ là những thư mục đơn giản, ở đây. Chúng là những gói. Nếu bạn có hai gói riêng biệt trong một thư mục đơn giản KHÔNG phải là gói, bạn không thể sử dụng nhập tương đối để chuyển từ gói này sang gói khác. Bạn sẽ phải làm việc với đường dẫn tìm kiếm Python cho điều đó và điều đó nằm ngoài phạm vi của hướng dẫn này. [Xem tài liệu ở cuối bài viết này. ]

import re
78

Bạn có nhớ khi tôi đề cập đến việc tạo một

import re
78 trong gói cấp cao nhất của chúng tôi không? . Gói
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
8 của tôi có thể được chạy từ thư mục gốc của kho lưu trữ của tôi với
import re
79

Đây là nội dung của tập tin đó

import re
3

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Vâng, đó thực sự là nó. Tôi đang nhập mô-đun của mình

import re
05 từ gói cấp cao nhất
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
8

Hãy nhớ rằng, tôi cũng có thể nói

import re
07 thay vì. Ngoài ra, nếu tôi chỉ muốn nói
import re
08 thay vì
import re
09, tôi có thể đã làm
import re
10 hoặc
import re
11. Cuối cùng, nó không tạo ra nhiều khác biệt về mặt kỹ thuật CÁCH tôi thực hiện thao tác nhập đó, miễn là mã có thể đọc được

[Ghi chú bên lề. Chúng ta có thể tranh luận xem việc tôi có một

import re
12 riêng cho chức năng chính của mình là
import re
08 có hợp lý hay không, nhưng tôi có lý do của mình. và chúng nằm ngoài phạm vi của hướng dẫn này. ]

Phần khiến hầu hết mọi người bối rối lúc đầu là toàn bộ câu lệnh

import re
14. Python không có nhiều bản soạn sẵn - mã phải được sử dụng khá phổ biến mà ít hoặc không cần sửa đổi - nhưng đây là một trong những bit hiếm hoi đó

import re
15 là thuộc tính chuỗi đặc biệt của mọi mô-đun Python. Nếu tôi dán dòng
import re
16 ở đầu
# smart_door.py
def close[]:
    print["Ahhhhhhhhhhhh."]

def open[]:
    print["Thank you for making a simple door very happy."]
62, khi mô-đun đó được nhập [và do đó chạy], chúng ta sẽ thấy "thiếu sót. dữ liệu. cài đặt" được in ra

Khi một mô-đun được chạy trực tiếp qua

import re
18, mô-đun đó được gán một giá trị đặc biệt là
import re
15. "chính"

Do đó,

import re
20 thực sự đang kiểm tra xem mô-đun có đang được thực thi dưới dạng mô-đun chính hay không. Nếu có, nó sẽ chạy mã theo điều kiện

Bạn có thể thấy điều này trong hành động theo một cách khác. Nếu tôi thêm phần sau vào dưới cùng của

import re
12

import re
4

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Sau đó, tôi có thể thực thi mô-đun đó trực tiếp thông qua

import re
22 và kết quả giống như
import re
79. Bây giờ
import re
78 đang bị bỏ qua hoàn toàn và
import re
15 của
import re
26 là
import re
27

Trong khi đó, nếu tôi chỉ chạy

import re
79, mã đặc biệt đó trong
import re
12 sẽ bị bỏ qua, vì
import re
15 của nó bây giờ lại là
import re
31

Xem nó hoạt động như thế nào?

kết thúc

Hãy xem xét

  • Mọi dự án nên sử dụng VCS, chẳng hạn như Git. Có rất nhiều lựa chọn để lựa chọn

  • Mỗi tệp mã Python [

    # smart_door.py
    def close[]:
        print["Ahhhhhhhhhhhh."]
    
    def open[]:
        print["Thank you for making a simple door very happy."]
    
    2] là một mô-đun

  • Sắp xếp các mô-đun của bạn thành các gói. Mỗi gói phải chứa một tệp

    # smart_door.py
    def close[]:
        print["Ahhhhhhhhhhhh."]
    
    def open[]:
        print["Thank you for making a simple door very happy."]
    
    3 đặc biệt

  • Dự án của bạn thường bao gồm một gói cấp cao nhất, thường chứa các gói phụ. Gói cấp cao nhất đó thường chia sẻ tên dự án của bạn và tồn tại dưới dạng một thư mục trong thư mục gốc của kho lưu trữ dự án của bạn

  • KHÔNG BAO GIỜ BAO GIỜ sử dụng

    import re
    
    34 trong câu lệnh nhập. Trước khi bạn giải quyết một ngoại lệ có thể xảy ra, Zen of Python chỉ ra "Các trường hợp đặc biệt không đủ đặc biệt để phá vỡ các quy tắc. "

  • Sử dụng nhập khẩu tuyệt đối hoặc tương đối để tham khảo các mô-đun khác trong dự án của bạn

  • Các dự án có thể thực thi nên có một

    import re
    
    78 trong gói cấp cao nhất. Sau đó, bạn có thể trực tiếp thực thi gói đó với
    import re
    
    36

Tất nhiên, có rất nhiều khái niệm và thủ thuật nâng cao hơn mà chúng ta có thể sử dụng để cấu trúc một dự án Python, nhưng chúng ta sẽ không thảo luận về điều đó ở đây. Tôi thực sự khuyên bạn nên đọc các tài liệu

  • Tham chiếu Python. hệ thống nhập khẩu
  • Hướng dẫn Python. mô-đun
  • PEP 8. Hướng dẫn phong cách cho Python
  • PEP 20. Thiền của Python
  • PEP 240. Gói không gian tên tiềm ẩn

Cảm ơn bạn tới

import re
37,
import re
38 [Freenode IRC
import re
39], @cbrintnall và @rhymes [Dev] về những sửa đổi được đề xuất

Chủ Đề