30/09/2018, 17:21
Ý nghĩa của if __name__ == '__main__': trong Python?
Hi mọi người,
Mình bắt đầu đọc quyển python network programming cookbook, có đoạn này mình không hiểu, mọi người giúp đỡ
import socket
def print_machine_info():
host_name = socket.gethostname()
ip_address = socket.gethostbyname(host_name)
print "Host name: %s" % host_name
print "IP address: %s" % ip_address
if __name__ == '__main__':
print_machine_info()
Cái đoạn
if __name__ == '__main__':
print_machine_info()
Nó có ý nghĩa gì thế ? khi mình chạy file python với nội dung như trên thì nó báo : name chưa được định nghĩa.
Anh em giúp mình với
Bài liên quan
Tại sao code trên không chạy được?
Là vì bạn indent, hay nói cách khác là cách đầu dòng, vào bị sai rồi. Phải viết lại như thế này. Đạt chạy ổn
Kết quả trả ra:
Tại sao nên sử dụng điều kiện if này?
Về ý nghĩa của nó thì nó giống như các C và các ngôn ngữ khác bắt đầu một chương trình. Ta cần có một điểm để bắt đầu. Thì khi ta viết
if __name__ == '__main__':
thì Python sẽ thực thi phần lệnh phía sau của lệnhif
nếu file này được thực thi bằng lệnhpython
. Đây là một phong cách lập trình của Python mà ta nên sử dụng.Tại sao ta làm được như thế?
Lý do bên dưới của kỹ thuật này là khi Python interpreter đọc qua code Python thì nó sẽ chạy tất cả những lệnh mà nó thấy, từ trên xuống dưới.
Ví dụ nếu ta viết như sau thì nó sẽ in ra
day nhau hoc
Nhưng trước khi chạy những dòng code này Python Interpreter sẽ định nghĩa một số biến đặc biệt, trong đó có biến
__name__
. Nếu biến__name__
này thuộc về một module mà ta include, trong ví dụ dưới đây Đạt có một filedaynhauhoc.py
và file này include modulewhileloop
, thì biến__name__
này sẽ được gán bằng tên của module đó.Trong file
daynhauhoc.py
tainclude whileloop
Trong file
whileloop.py
ta có dòng nàyThì kết quả khi chạy file
daynhauhoc.py
ta sẽ đượcNếu biến
__name__
này nằm trong file mà ta chạy trực tiếp bằng lệnh python. Thì Python Interpreter, tức trình thông dịch của Python, sẽ gán__name__
bằng__main__
. Nếu ta thêm dòng này vào filedaynhauhoc.py
Thì ta sẽ có toàn bộ output là
Tham khảo: http://stackoverflow.com/a/419185/1989112
Wow, giờ đọc kĩ lại mới thấy thú vị nè
Tức là với chiêu này ta có thể “khóa” 1 đoạn code trong file chính lại khi nó được import bởi một file khác. Đoạn code bị khóa đó chỉ chạy khi file chính được mở trực tiếp => có thể tái sử dụng hàm trong file chính và test hàm thẳng từ trong module mà không sợ ảnh hưởng kết quả khi chạy file chính ( có import cái module đó)
khả năng đọc hiểu của em kém quá. Bác giải thích đơn giản hơn được không ạ ? lấy ví dụ từ hình kia luôn, bác giải thích cho em với. Mông rung à mà nhầm mông lung quá à
__name__
là một biến đặc biệt. Nếu biến này nằm trong một file python bất kỳ. Giả dụ ta có filedaynhauhoc.py
, thì khi ta chạy__name__
sẽ có giá trị__main__
Hiểu tới đây được rồi
Cái đấy thì em hiểu rồi anh ạ còn đoạn cmt của bác @thanhmssl10 thì em chưa hiểu lắm
À, tức là em đang nói tới phần comment của @thanhmssl10?
Còn câu trả lời của anh có trả lời được câu hỏi đầu tiên của em chưa?
Hiểu đơn giản là biến
__name__
là một biến được tự động sinh ra trong mỗi một file .py có giá trị bằng đúng tên của file .py đó. `Dạng name.py => Ví dụ: daynhauhoc.py có chứa name = “daynhauhoc”``Biến
__main__
là một biến được tự động sinh ra khi một process python được chạy. Nó có giá trị bằng đúng tên của file đang chiếm quyền thực thị.Việc sử dụng kĩ thuật trên dùng để xác định xem đoạn code có được chạy trong file đang chiếm quyền thực thi hay không. Hay là chạy thông qua việc được import và được gọi đến bởi file đang chiếm quyền thực thị.
Hi vọng là nó có thể giúp bạn hiểu.
Em hiểu rồi anh ạ, anh giải thích rất rõ ràng. Lần này chưa tìm kỹ đã hỏi, ngại quá
Vậy em check vào accept câu trả lời của anh đi
@GDGHN_AndroidTeam hình như có chút nhầm lẫn, theo Đạt biết,
__main__
không phải là biếnGiờ mới để ý có nút accept
Cái của @thanhmssl10 ý là bạn có thể viết luôn code unit test trong chính cái file A. Và code test này sẽ chỉ chạy khi bạn chạy trực tiếp file A thôi. Khi có file B khác sử dụng đến nó, nó sẽ không thực thi các đoạn code unit test.
=> Không ảnh hưởng đến luồng xử lí của các file B đang gọi đến file A dù cho trong A có code Unit test (Đoạn code unit test chỉ nên dùng với A thôi, B không cần)
Điều này có gì tốt: Nếu Java ta cần 1 file chạy và 1 file unit test thì python không cần. Tất cả được cho vào một chỗ mà vẫn không bị ảnh hưởng đến những file khác sẽ sử dụng đến nó.
Chết thật. Trước giờ cứ hiểu sai… Hi hi…
Cho mình hỏi, tại sao mình chạy file : tên là 123.py
Với nội dung là : print _name
Thì kết quả lại ra : main
Chứ không phải là “123” ?
20 chả 20 chả 20 chả
Ý mình là theo anh này giải thích thì name = tên file
chứ không phải =main
Nói đơn giản: ví dụ bạn có mymodule.py
Khi bạn gọi mymodule.py từ một module khác:
thì
__name__
sẽ là mymoduleNếu bạn gọi từ console (run mymodule.py)
python mymodule.py
thì
__name__
sẽ là__main__