Tin tức và phân tích của tất cả các thiết bị di động

Hiểu nếu __name__ == ‘__main__’ trong Python

Trong hướng dẫn này, bạn sẽ hiểu chức năng và ý nghĩa của if __name__ == ‘__main__’ trong Python.

Bạn đã bao giờ nhìn vào cơ sở mã python với các mô-đun khác nhau chưa?

Nếu vậy, có thể bạn sẽ gặp câu điều kiện __name__ == ‘__main__’ trong một hoặc nhiều mô-đun. Trong vài phút tới, chúng ta sẽ giải thích ý nghĩa của câu điều kiện trên và xem xét một ví dụ mà nó có thể hữu ích.

Hãy bắt đầu!

Ý nghĩa của __name__ trong Python là gì?

Trong Python, một mô-đun là một tệp .py chứa các định nghĩa hàm, một tập hợp các biểu thức đánh giá, v.v. Ví dụ: nếu chúng tôi có một tệp có tên hello_world.py, chúng tôi sẽ gọi nó là mô-đun hello_world.py hoặc hello_world.

Khi bạn chạy một mô-đun python, trình thông dịch python sẽ đặt giá trị của một vài biến đặc biệt trước khi thực thi: __name__ là một trong số đó. Chìa khóa để hiểu ý nghĩa của __name__ là hiểu cách nhập hoạt động trong Python.

📁 Nhận mã cho phần này tại đây.

Đi đến thư mục ví dụ1. Chúng tôi có một tệp module1.py. Biến __name__ nằm trong không gian tên của mô-đun hiện tại.

Mô-đun này in ra một dòng theo sau là giá trị của biến __name__.

# example-1/module1.py
print("This is module1.")
print(f"The __name__ variable of module 1 is: {__name__}.")

Bây giờ hãy chạy module1 từ dòng lệnh.

$ python module1.py

Ở đầu ra, chúng ta thấy rằng biến __name__ được đặt thành __main__.

This is module1.
The __name__ variable of module 1 is: __main__.

Nhập mô-đun trong python

Ngoài việc chạy một mô-đun python, đôi khi bạn có thể muốn sử dụng chức năng từ một mô-đun python khác bên trong mô-đun hiện tại. Python làm cho việc nhập khẩu trở nên dễ dàng.

Nhập cho phép bạn sử dụng lại chức năng của mô-đun khác bằng cách nhập nó vào phạm vi của mô-đun hiện tại mà không phải viết lại mã của bạn.

Tệp module2.py chứa các mục sau. Bên trong, chúng tôi đã nhập module1. mô-đun2.

# example-1/module2.py

import module1 # module1 is imported

print(f"This is module2")
print(f"The __name__ variable of module2 is: {__name__}.")

Chúng tôi chạy module2.py và quan sát đầu ra.

$ python module2.py

Trong đầu ra sau:

  • Chúng ta có thể thấy rằng module1 được chạy ngầm khi chúng ta nhập nó vào module2 và đầu ra tương ứng được in ra.
  • Nhưng lần này biến __name__ không phải là __main__ mà là module1.
  • Vì chúng tôi đã bắt đầu trực tiếp mô-đun2, biến __name__ tương ứng với mô-đun hiện là __main__.
Output

This is module1.
The __name__ variable of module 1 is: module1.
This is module2
The __name__ variable of module2 is: __main__.

💡 Ý tưởng chính:

– Nếu mô-đun chạy trực tiếp, biến __name__ của mô-đun được đặt thành __main__.

– Nếu một mô-đun được nhập bên trong một mô-đun khác, thì __name__ của mô-đun đó được đặt thành tên của mô-đun.

Ví dụ nếu __name__==’__main__’ trong Python

Trong phần này, chúng ta sẽ thấy một trường hợp thực tế của việc sử dụng điều kiện if __name__ == ‘__main__’. Chúng tôi sẽ xác định một chức năng đơn giản và sau đó viết các bài kiểm tra đơn vị để xác minh rằng chức năng đó hoạt động như mong đợi.

📁 Tải code và làm theo hướng dẫn.

Mã cho phần này có thể được tìm thấy trong thư mục ví dụ2.

Ở đây add.py là một tệp python chứa định nghĩa của hàm add_ab(). Hàm add_ab() lấy hai số bất kỳ và trả về tổng của chúng.

# example-2/add.py

def add_ab(a,b):
    return a + b

Chúng tôi sẽ sử dụng mô-đun kiểm tra đơn vị Python để kiểm tra hàm add_ab().

Viết test case cho hàm python

Hãy xem đoạn mã sau chứa nội dung của mô-đun test_add.

# example-2/test_add.py

import unittest
from add import add_ab

class TestAdd(unittest.TestCase):
    def test_add_23(self):
        self.assertEqual(add_ab(2,3), 5)
    
    def test_add_19(self):
        self.assertEqual(add_ab(1,9), 10)
    
    def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), -6)
    

Đoạn mã trên thực hiện như sau:

  • Nhập mô-đun kiểm tra đơn vị tích hợp sẵn của Python
  • Nhập hàm add_ab() từ mô-đun thêm
  • Định nghĩa lớp kiểm tra TestAdd và một tập hợp các trường hợp kiểm tra dưới dạng các phương thức trong lớp kiểm tra

Để thiết lập kiểm tra đơn vị cho mã của bạn, trước tiên bạn phải xác định lớp kiểm tra kế thừa từ unittest.TestCase. Tất cả các trường hợp thử nghiệm phải được chỉ định làm phương thức bên trong một lớp và phải bắt đầu bằng test_.

Lưu ý: Nếu bạn không đặt tên cho các phương thức là test_, bạn sẽ thấy rằng các thử nghiệm liên quan sẽ không được phát hiện và do đó không chạy được.

Bây giờ, hãy thử chạy mô-đun test_add từ thiết bị đầu cuối.

$ python test_add.py

Bạn sẽ thấy rằng không có đầu ra và không có bài kiểm tra nào đã chạy.

Tại sao vậy?🤔

Điều này là do để chạy thử nghiệm đơn vị, bạn nên chạy unittest làm mô-đun chính khi chạy test_add.py bằng lệnh bên dưới.

$ python -m unittest test_add.py

Sau khi chạy lệnh chi tiết ở trên, chúng ta có thể thấy rằng cả ba bài kiểm tra đều đã vượt qua.

Output
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

Tuy nhiên, sẽ thuận tiện hơn để chạy thử nghiệm khi mô-đun test_add này đang chạy, phải không? Hãy tìm hiểu cách thực hiện điều đó trong phần tiếp theo.

Sử dụng if __name__ == ‘__main__’ để chạy thử nghiệm đơn vị dưới dạng mô-đun gốc

Nếu bạn muốn chạy tất cả các bài kiểm tra đơn vị trong khi mô-đun đang chạy trực tiếp, bạn có thể thêm một điều kiện.

# example-2/test_add.py

import unittest
from add import add_ab

class TestAdd(unittest.TestCase):
    def test_add_23(self):
        self.assertEqual(add_ab(2,3), 5)
    
    def test_add_19(self):
        self.assertEqual(add_ab(1,9), 10)
    
    def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), -6)

# Run unittest as the main module
if __name__ == '__main__':
        unittest.main()

Điều kiện trong đoạn mã trên cho trình thông dịch python biết: Nếu mô-đun này được chạy trực tiếp, hãy chạy mã bên trong nó. unit_test.main().

Bạn có thể chạy mô-đun test_add sau khi thêm hai dòng mã trên.

$ python test_add.py

▶️ Việc khởi chạy trực tiếp mô-đun thử nghiệm thêm hiện chạy cả ba thử nghiệm mà chúng tôi đã xác định.

Output
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

Đầu ra OK ở trên chỉ ra rằng tất cả các thử nghiệm đều thành công. Ba dấu chấm… cho biết rằng ba bài kiểm tra đã được thực hiện và tất cả đều vượt qua.

Bây giờ, hãy thay đổi giá trị trả về dự kiến ​​của test_add_1_minus7 thành 8. Vì hàm trả về – trong trường hợp này 6nên có một thử nghiệm thất bại.

def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), 8)

Như bạn có thể thấy trong đầu ra bên dưới, chúng tôi nhận được .F., từ ba lần kiểm tra, mẫu một trong số chúng không thành công (kiểm tra thứ hai) và trong dấu vết, chúng tôi nhận được một AssertionError cho biết – 6 != 8.

Output
.F.
======================================================================
FAIL: test_add_1_minus7 (__main__.TestAdd)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_add.py", line 12, in test_add_1_minus7
    self.assertEqual(add_ab(1,-7), 8)
AssertionError: -6 != 8

----------------------------------------------------------------------
Ran 3 tests in 0.021s

FAILED (failures=1)

Điều quan trọng cần lưu ý là các bài kiểm tra không nhất thiết phải chạy theo cùng thứ tự mà chúng được chỉ định trong lớp kiểm tra. Trong ví dụ trên, test_add_1_minus7 được định nghĩa là phương thức thứ ba trong lớp thử nghiệm, nhưng thử nghiệm tương ứng được chạy thứ hai.

Tóm lại

Tôi hy vọng hướng dẫn này đã giúp bạn hiểu cách điều kiện if __name__ == ‘__main__’ hoạt động trong Python.

Dưới đây là một bản tóm tắt ngắn gọn về những phát hiện quan trọng nhất:

  • Trình thông dịch Python đặt biến __name__ trước khi thực thi tập lệnh Python.
  • Khi bạn chạy mô-đun trực tiếp, giá trị của __name__ là __main__.
  • Khi bạn nhập một mô-đun vào tập lệnh python khác, giá trị của __name__ là tên của mô-đun.
  • Bạn có thể sử dụng if __name__ == ‘__main__’ để kiểm soát việc thực thi và phần nào của mô-đun được chạy trong quá trình chạy trực tiếp và nhập tương ứng.

Sau đó, hãy xem hướng dẫn chi tiết này về các tập hợp Python. Chúc bạn học tập vui vẻ!🎉