Hướng dẫn how do multiple files work in python? - làm thế nào để nhiều tệp hoạt động trong python?

Chào mừng bạn đến với ngày 21 của 30 ngày của loạt phim Python! Hôm nay chúng ta sẽ tìm hiểu về cách (và tại sao) chia mã Python của chúng tôi thành nhiều tệp.

Tuy nhiên, trước tiên, chúng tôi sẽ nhanh chóng tóm tắt lại cách nhập khẩu hoạt động trong Python. Bắt đầu nào!

Tóm tắt nhập khẩu trong Python

Thực hiện một bản tóm tắt nhanh là đáng giá trong trường hợp này, bởi vì điều quan trọng là chúng tôi hiểu một vài điểm trước khi tắt và tạo rất nhiều tệp cho các chương trình của chúng tôi!

Nếu bạn muốn một cái gì đó toàn diện hơn một chút, hãy đọc lại bài đăng ngày 18, nơi chúng tôi lần đầu tiên nhập khẩu.

Nhập thêm tên vào import math print(math.pi) # 3.14 7

Nếu bạn có tệp Python và bạn nhập cái này:

import json

print(globals())

Sau đó, hiển thị các tên hiện tại trong không gian tên toàn cầu. Tên mô -đun sẽ nằm trong không gian tên toàn cầu, sẵn sàng để bạn sử dụng.

Nhập cho phép chúng tôi truy cập các yếu tố của mô -đun đã nhập

Sau khi nhập, chúng tôi có thể làm một cái gì đó như thế này để truy cập vào một cái gì đó bên trong một mô -đun:

import math

print(math.pi)  # 3.14

Chúng tôi đã truy cập tên

import math

print(math.pi)  # 3.14
8 bên trong mô -đun
import math

print(math.pi)  # 3.14
9. Trong trường hợp này, đó là giá trị của hằng số toán học, pi.

Bạn có thể sử dụng từ khóa

import myfile
0 để đặt cho mô -đun đã nhập một tên khác trong mã của bạn. Tôi không khuyên bạn nên làm điều này, mặc dù bạn sẽ thấy nó được thực hiện mọi lúc mọi nơi!

Bạn cũng có thể sử dụng

import myfile
1 để thêm hầu hết mọi thứ từ mô -đun đến không gian tên toàn cầu của bạn. Điều này có thể "gây ô nhiễm" không gian tên toàn cầu, lấp đầy nó bằng các biến. Hầu hết thời gian, nó rất nản lòng.

Tại sao chia mã của bạn thành các tập tin?

Bây giờ chúng tôi đã nhanh chóng tóm tắt lại chủ đề nhập khẩu, hãy nói về lý do tại sao chúng tôi có thể muốn chia mã của chúng tôi thành nhiều tệp!

Câu hỏi đầu tiên chúng ta nhận được khi chúng ta bắt đầu thảo luận về điều này là: "Không dễ dàng giữ mã trong một tệp?".

Rốt cuộc, sau đó bạn không phải đối phó với nhập khẩu!

Giữ mã của bạn trong một tệp có thể giúp việc viết dễ dàng hơn (để bắt đầu!), Nhưng khi bạn viết nhiều hơn, nó sẽ khiến việc đọc và sửa đổi trở nên khó khăn hơn nhiều.

Trong lập trình, khả năng đọc và khả năng bảo trì của Trump tốc độ viết bất cứ ngày nào!

Tách mối quan tâm và dễ dàng tổ chức

Khi chúng tôi tách mã thành các tệp, điều quan trọng là chúng tôi có lý do để đặt một số mã vào một tệp nhất định. Thông thường, chúng tôi đi theo mối quan tâm. Mã thực hiện một điều đi vào một tệp và mã thực hiện một cái gì đó khác đi vào một tệp khác.

Ví dụ: chúng tôi có thể có một tệp cho tương tác người dùng (in và đầu vào) và một tệp khác để lưu trữ dữ liệu (lưu và truy xuất mọi thứ từ một tệp).

Hiện tại, các mối quan tâm khác nhau của ứng dụng Python có thể không rõ ràng với bạn. Điều đó là bình thường! Theo thời gian, bạn sẽ tìm hiểu thêm về điều này. Với nhiều kinh nghiệm hơn, nó sẽ trở nên rõ ràng hơn khi mọi thứ sẽ được hưởng lợi từ việc chia thành các tệp.

Tách các tệp theo mối quan tâm, giả sử chúng tôi cung cấp cho các tệp tên tốt, cũng giúp chúng tôi tìm mã dễ dàng hơn. Nếu bạn có hai FILS được gọi là

import myfile
2 và
import myfile
3, bạn sẽ biết những gì bạn sẽ tìm thấy trong mỗi cái!

Sử dụng các tập tin và thư mục cũng kỳ diệu cho tổ chức. Ví dụ, bạn có thể đặt các tệp liên quan đến làm việc với các loại lưu trữ dữ liệu khác nhau vào một thư mục.

Cải thiện khả năng đọc

Khi các tập tin của bạn phát triển, chúng bắt đầu trở nên khó đọc hơn. Bạn có thể có nhiều chức năng và biến, và việc tìm kiếm mọi thứ có thể đòi hỏi nhiều cuộn.

Các biên tập viên hiện đại có các tính năng để dễ dàng tìm thấy nơi mọi thứ được xác định, nhưng đây không phải là một giải pháp hoàn hảo.

Chia mã của bạn thành nhiều tệp là một cách tuyệt vời để tạo ra các tệp nhỏ hơn, tập trung hơn. Điều hướng các luận án nhỏ hơn các tệp nhỏ hơn sẽ dễ dàng hơn và do đó, sẽ hiểu nội dung của từng tệp này.

Dễ dàng sử dụng lại mã

Khi bạn có nhiều tệp nhỏ hơn, tập trung, việc sử dụng lại nội dung của một tệp trong nhiều tệp khác sẽ dễ dàng hơn bằng cách nhập.

Cũng có thể có quá nhiều tập tin! Đừng nhằm mục đích làm cho các tệp của bạn nhỏ nhất có thể. Thay vào đó, làm cho họ tập trung.

Nếu mỗi tệp liên quan đến một khía cạnh của ứng dụng của bạn và mọi tệp có một tên tốt, việc điều hướng dự án của bạn sẽ dễ dàng!

Làm việc với hai tệp

Hãy bắt đầu bằng cách đi vào một dự án Python mới (hoặc repl.it replet) và tạo hai tệp. Hãy gọi chúng là

import myfile
4 và
import myfile
5.

Hãy nhớ rằng repl.it sẽ luôn chạy

import myfile
4 khi bạn nhấn nút "Chạy", như chúng tôi đã đề cập trong bài 0 ngày.

Bởi vì cả hai tệp đều nằm trong cùng một thư mục, bạn có thể nhập một tệp khác.

Hãy nhập cái này vào

import myfile
4:

import myfile

Lưu ý rằng chúng tôi không nhập

import myfile
5, nhưng chỉ
import myfile
9. Python làm phần còn lại!

Điều gì xảy ra khi bạn nhập

Khi chúng tôi nhập một tệp, Python chạy tệp. Nó phải làm điều đó để xác định tên nào tồn tại trong tệp đó.

Sau đó, nó làm cho tệp đó có sẵn cho chúng tôi trong

import myfile
4 bằng cách đặt một tham chiếu đến mô -đun trong không gian tên toàn cầu.

Hãy thêm một cái gì đó vào

import myfile
5:

print("Hello, world!")

Bây giờ chúng ta hãy nhập tệp từ

import myfile
4:

import myfile

print("What's going on?")

Hãy thử chạy điều đó.

Bạn sẽ thấy rằng chúng ta nhận được hai điều được in ra:

Hello, world!
What's going on?

Đó là bởi vì tệp

import myfile
5 đã được thực thi. Nó chứa một cuộc gọi
print("Hello, world!")
4, do đó, Python đã in ra!

Thật hiếm khi bạn viết mã như thế này. Thay vào đó, các tệp bạn nhập thường sẽ chứa các biến và hàm, để khi bạn nhập chúng, không có gì thực sự xảy ra cho đến khi bạn thực sự sử dụng các biến và hàm đó.variables and functions, so that when you import them nothing actually happens until you actually use those variables and functions.

Hãy thêm một cái gì đó thực tế hơn một chút vào

import myfile
5. Có lẽ một cái gì đó như thế này:

def get_user_age():
    return int(input("Enter your age: "))

Bây giờ trong

import myfile
4, chúng ta có thể sử dụng hàm
print("Hello, world!")
7 mà chúng ta đã xác định trong
import myfile
5.

import myfile

try:
    myfile.get_user_age()
except ValueError:
    print("That's not a valid value for your age!")

Great!

Đó là ý chính của nó: tách mọi thứ thành các tập tin và nhập chúng!

Đừng đặt cho các tệp của bạn cùng tên với các mô-đun tích hợp.

Ví dụ: nếu bạn tạo một tệp mới và gọi nó là ____39, bạn sẽ gặp rắc rối!

Đó là bởi vì nếu một tệp khác cố gắng

import myfile

print("What's going on?")
0, bạn sẽ không nhập mô-đun
import myfile

print("What's going on?")
1 tích hợp cho phép chúng tôi nói chuyện với các tệp JSON. Thay vào đó, bạn sẽ nhập tệp
print("Hello, world!")
9!

Python luôn tìm trong thư mục dự án để nhập trước khi xem các gói được cài đặt hoặc tích hợp.

Các tệp của bạn hoạt động giống như các mô -đun

Mọi thứ chúng tôi có thể làm với các mô -đun bên ngoài, chúng tôi có thể làm với các tệp của riêng mình:

  • Nhập toàn bộ tệp với
    import myfile
    
    print("What's going on?")
    
    3 và sau đó gọi mọi thứ là
    import myfile
    
    print("What's going on?")
    
    4.
  • Nhập những thứ cụ thể với
    import myfile
    
    print("What's going on?")
    
    5.
  • Nhập khẩu bí danh.
  • Chúng ta có thể làm
    import myfile
    
    print("What's going on?")
    
    6 (mặc dù nó không được khuyến khích).

Sử dụng các tệp và thư mục

Bạn có thể tạo các thư mục cho các tệp của mình nếu bạn nghĩ rằng điều đó sẽ giúp tổ chức. Theo kinh nghiệm của tôi, nó thường làm.

Ví dụ: tạo một thư mục trong dự án của bạn có tên là

import myfile

print("What's going on?")
7 và di chuyển
import myfile
5 vào nó. Bây giờ cấu trúc tệp/thư mục của bạn sẽ trông như thế này:

________số 8

Từ

import myfile
4 bây giờ bạn phải sử dụng cú pháp hơi khác nhau để nhập
import myfile
5:

from user_interactions.myfile import get_user_age

try:
    get_user_age()
except ValueError:
    print("That's not a valid value for your age!")

Khi nhập, dấu chấm (

Hello, world!
What's going on?
1) có nghĩa là một cái gì đó giống như "bên trong".

Trong ví dụ trên, do đó chúng tôi đang nhập

import myfile
9 từ bên trong
import myfile

print("What's going on?")
7.

Nếu bạn có nhiều bộ phụ, bạn sẽ cần sử dụng nhiều

Hello, world!
What's going on?
1 để tách các cấp độ khác nhau của các thư mục và tệp, như thế này:

import math

print(math.pi)  # 3.14
0

Khi bạn đang nhập như thế này, bạn sẽ nhập những thứ cụ thể như chúng tôi đã thực hiện hoặc bạn sẽ sử dụng nhập khẩu bí danh. Một trong hai điều này là tốt (cái đầu tiên nói chung là tốt hơn):

  • Hello, world!
    What's going on?
    
    5
  • Hello, world!
    What's going on?
    
    6

Bạn thường sẽ không làm bất cứ điều gì như trong ví dụ dưới đây, bởi vì nó có thể khá lâu để gõ ra:

import math

print(math.pi)  # 3.14
1

Bạn cần tham khảo nhập hoàn toàn khi bạn muốn sử dụng thứ gì đó, vì vậy bạn sẽ gõ

Hello, world!
What's going on?
7 rất nhiều trong mã của mình!

Mặc dù vậy, bạn sẽ không sử dụng tệp nhiều.

Chế độ tập lệnh so với chế độ mô -đun

Khi chúng tôi chạy một tệp (ví dụ: trong repl.it, đó là

import myfile
4), chúng tôi nói rằng tệp được chạy trong "chế độ tập lệnh".

Khi chúng tôi nhập một tệp, tệp đó chạy ở "Chế độ mô -đun".

Hiện tại cấu trúc dự án của chúng tôi là như thế này:

- main.py
- user_interactions/
    | - myfile.py

Tôi sẽ xóa nội dung của cả hai tệp và tôi sẽ đặt nó trong

import myfile
5:

import math

print(math.pi)  # 3.14
3

Và tôi sẽ làm điều này trong

import myfile
4:

import math

print(math.pi)  # 3.14
4

Bạn sẽ thấy đầu ra này:

import math

print(math.pi)  # 3.14
5

Hãy nhớ rằng khi chúng tôi nhập, chúng tôi chạy tập tin. Do đó, dòng đầu ra đầu tiên thuộc về

import myfile
5 và dòng đầu ra thứ hai thuộc về
import myfile
4.

Tệp mà chúng tôi chạy luôn có biến

def get_user_age():
    return int(input("Enter your age: "))
3 với giá trị
def get_user_age():
    return int(input("Enter your age: "))
4. Đó chỉ đơn giản là cách Python nói với chúng tôi rằng chúng tôi đã chạy tập tin đó.

Bất kỳ tệp nào không có

def get_user_age():
    return int(input("Enter your age: "))
3 bằng
def get_user_age():
    return int(input("Enter your age: "))
4 đều được nhập.

Hãy thử di chuyển mọi thứ xung quanh và xem đầu ra được tạo bởi

import myfile
5 thay đổi như thế nào!

Chỉ chạy mã trong chế độ tập lệnh

Đôi khi chúng tôi muốn đưa một số mã vào một tệp, nhưng chúng tôi chỉ muốn mã đó chạy nếu chúng tôi thực thi tệp đó trực tiếp và không nếu chúng tôi nhập tệp.

Vì chúng ta biết rằng

def get_user_age():
    return int(input("Enter your age: "))
3 phải bằng
def get_user_age():
    return int(input("Enter your age: "))
4 cho một tệp đã được chạy, chúng ta có thể sử dụng câu lệnh IF.

Chúng tôi có thể nhập cái này trong

import myfile
5:

import math

print(math.pi)  # 3.14
6

Điều đó có thể cho phép chúng tôi chạy

import myfile
5 (chúng tôi không thể làm điều đó trong bản sao. Nó không có một số cấu hình bổ sung) và xem chức năng
import myfile

try:
    myfile.get_user_age()
except ValueError:
    print("That's not a valid value for your age!")
2 có hoạt động không.

Đó là một trong những trường hợp sử dụng chính của cấu trúc này: để giúp chúng tôi xem liệu các công cụ trong tệp có hoạt động khi chúng tôi thường không muốn nó chạy hay không.

Một trường hợp sử dụng khác là cho các tệp mà bạn thường không tự chạy. Đôi khi bạn có thể viết một tệp được sử dụng bởi một chương trình khác, ví dụ.

Sử dụng cấu trúc này sẽ cho phép bạn chạy tệp của mình để kiểm tra, trong khi không ảnh hưởng đến chức năng của nó khi được nhập bởi một chương trình khác.

Bài tập

Đối với bài tập (duy nhất) ngày hôm nay, chúng tôi sẽ cung cấp cho bạn một loạt các mã trong một tệp.

Truy cập mã ở đây.

Nhiệm vụ của bạn là chia mã đó thành nhiều tệp.Bạn có thể chọn số lượng và tệp nào bạn muốn chia mã thành, nhưng hãy suy nghĩ về lý do tại sao bạn đặt mỗi phần vào mã trong mỗi tệp!

Sau đó, khi bạn hoàn thành, hãy xem giải pháp tập thể dục của chúng tôi để xem cách chúng tôi chia mã và tại sao.

Dự án

Đối với dự án hôm nay, chúng tôi sẽ sử dụng thư viện Python để tạo một số biểu đồ!Là một phần của dự án này, bạn sẽ phải cấu trúc tốt mã của mình để nó không trở thành một mớ hỗn độn không thể đọc được.

Kiểm tra bản tóm tắt của dự án để biết thêm thông tin về dự án hôm nay.