Hướng dẫn python argparse if __name__ == __main__ - python argparse nếu __name__ == __main__

Nếu tôi đang sử dụng argparse và thử nghiệm

 1if __name__ == "__main__":
 2    ...
4 trong tập lệnh mà tôi cũng muốn sử dụng làm mô -đun, tôi có nên nhập Argparse theo thử nghiệm đó và sau đó khởi tạo nó không? Không có hướng dẫn phong cách nào tôi đã tìm thấy đề cập bằng cách sử dụng Argparse trong các tập lệnh và nhiều ví dụ về kịch bản Argparse không sử dụng kiểm tra 'nếu tên' hoặc sử dụng nó khác nhau. Đây là những gì tôi đã đi với cho đến nay:

#! /usr/bin/env python

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)

Tôi có nên nhập Argparse với các mô -đun khác của tôi ở phía trên và định cấu hình nó trong phần thân của tập lệnh không?

Hướng dẫn python argparse if __name__ == __main__ - python argparse nếu __name__ == __main__

Chuck

4.5241 Huy hiệu vàng29 Huy hiệu bạc53 Huy hiệu đồng1 gold badge29 silver badges53 bronze badges

Đã hỏi ngày 15 tháng 1 năm 2015 lúc 5:35Jan 15, 2015 at 5:35

Tôi sẽ đặt nhập ở đầu, nhưng để lại mã sử dụng nó bên trong khối

 1if __name__ == "__main__":
 2    ...
5:

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)

Đặt nhập khẩu ở vị trí hàng đầu làm rõ mô -đun mà mô -đun của bạn sử dụng. Nhập argpase ngay cả khi bạn không sử dụng, nó sẽ có tác động hiệu suất không đáng kể.

Đã trả lời ngày 15 tháng 1 năm 2015 lúc 5:41Jan 15, 2015 at 5:41

Hướng dẫn python argparse if __name__ == __main__ - python argparse nếu __name__ == __main__

BrenbarnbrenbarnBrenBarn

Phù thủy vàng 234K3535 gold badges397 silver badges375 bronze badges

1

Sẽ tốt khi đặt

 1if __name__ == "__main__":
 2    ...
6 trong khối
 1if __name__ == "__main__":
 2    ...
4 nếu
 1if __name__ == "__main__":
 2    ...
8 chỉ được đề cập trong khối đó. Rõ ràng mã trong khối đó sẽ không chạy nếu mô -đun của bạn được nhập bởi một mô -đun khác, do đó, mô -đun đó sẽ phải cung cấp đối số riêng của nó cho
 1if __name__ == "__main__":
 2    ...
9 (có thể sử dụng thể hiện riêng của nó là
 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
0).

Hướng dẫn python argparse if __name__ == __main__ - python argparse nếu __name__ == __main__

jtlz2

6.7997 Huy hiệu vàng60 Huy hiệu bạc102 Huy hiệu Đồng7 gold badges60 silver badges102 bronze badges

Đã trả lời ngày 15 tháng 1 năm 2015 lúc 5:36Jan 15, 2015 at 5:36

Hướng dẫn python argparse if __name__ == __main__ - python argparse nếu __name__ == __main__

101101101

8.1763 Huy hiệu vàng38 Huy hiệu bạc65 Huy hiệu Đồng3 gold badges38 silver badges65 bronze badges

2

Bạn có thể gặp phải thành ngữ Python từ

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 khi đọc mã người khác. Không có gì ngạc nhiên khi nó lan rộng! Bạn thậm chí có thể đã sử dụng
 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 trong các kịch bản của riêng bạn. Nhưng bạn đã sử dụng nó một cách chính xác?

Có thể bạn đã lập trình bằng ngôn ngữ gia đình C như Java trước đây và bạn tự hỏi liệu cấu trúc này có phải là phụ kiện vụng về để sử dụng chức năng

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
3 làm điểm vào hay không.

Về mặt cú pháp, thành ngữ Python từ

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 chỉ là một khối có điều kiện bình thường:

 1if __name__ == "__main__":
 2    ...

Khối được thụt vào bắt đầu trong dòng 2 chứa tất cả mã mà Python sẽ thực thi khi câu lệnh có điều kiện trong dòng 1 đánh giá là

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
5. Trong ví dụ mã ở trên, logic mã cụ thể mà bạn đã đặt trong khối có điều kiện được biểu thị bằng dấu chấm lửng của trình giữ chỗ (
 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
6).

Vì vậy, nếu không có gì đặc biệt về thành ngữ

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1, thì tại sao nó lại trông khó hiểu, và tại sao nó tiếp tục gây ra cuộc thảo luận trong cộng đồng Python?

Nếu thành ngữ vẫn có vẻ hơi khó hiểu và bạn không hoàn toàn chắc chắn nó làm gì, tại sao bạn có thể muốn nó và khi nào nên sử dụng nó, thì bạn đã đến đúng nơi! Trong hướng dẫn này, bạn sẽ tìm hiểu tất cả về Python, ____ ____31 Idiom, bắt đầu với những gì nó thực sự làm trong Python và kết thúc với một gợi ý cho một cách nhanh hơn để đề cập đến nó.what it does, why you might want it, and when to use it, then you’ve come to the right place! In this tutorial, you’ll learn all about Python’s

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 idiom—starting with what it really does in Python, and ending with a suggestion for a quicker way to refer to it.

Tóm lại: nó cho phép bạn thực thi mã khi tệp chạy dưới dạng tập lệnh, nhưng không phải khi nó được nhập dưới dạng mô -đun

Đối với hầu hết các mục đích thực tế, bạn có thể nghĩ về khối có điều kiện mà bạn mở bằng

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 như một cách để lưu trữ mã chỉ nên chạy khi tệp của bạn được thực thi dưới dạng tập lệnh.

Bạn sẽ thấy điều đó có nghĩa là gì trong một khoảnh khắc. Hiện tại, giả sử bạn có tệp sau:

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))

Trong ví dụ này, bạn xác định một hàm,

$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
0, bắt chước một tiếng vang trong thế giới thực bằng cách in dần ngày càng ít hơn các chữ cái cuối cùng của văn bản đầu vào.

Dưới đó, trong các dòng 10 đến 12, bạn sử dụng thành ngữ

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1. Mã này bắt đầu với câu lệnh có điều kiện
 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 trong dòng 10. Trong các dòng thụt, 11 và 12, sau đó bạn thu thập đầu vào của người dùng và gọi
$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
0 với đầu vào đó. Hai dòng này sẽ thực thi khi bạn chạy
$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
4 dưới dạng tập lệnh từ dòng lệnh của bạn:

$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.

Khi bạn chạy tệp dưới dạng tập lệnh bằng cách chuyển đối tượng tệp cho trình thông dịch python của bạn, biểu thức

$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
5 trả về
 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
5. Khối mã trong
$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
7 sau đó chạy, do đó, Python thu thập đầu vào của người dùng và gọi
$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
0.

Hãy tự mình thử nó! Bạn có thể tải xuống tất cả các tệp mã mà bạn sẽ sử dụng trong hướng dẫn này từ liên kết bên dưới:

Đồng thời, nếu bạn nhập

$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
0 trong một mô -đun khác hoặc phiên giao diện điều khiển, thì mã lồng nhau sẽ giành được chạy:

>>>

>>> from echo import echo
>>> print(echo("Please help me I'm stuck on a mountain"))
ain
in
n
.

Trong trường hợp này, bạn muốn sử dụng

$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
0 trong bối cảnh của một phiên bản tập lệnh hoặc phiên thông dịch khác, vì vậy bạn đã thắng cần phải thu thập đầu vào của người dùng. Chạy
>>> from echo import echo
>>> print(echo("Please help me I'm stuck on a mountain"))
ain
in
n
.
1 sẽ gây rối với mã của bạn bằng cách tạo ra một tác dụng phụ khi nhập
>>> from echo import echo
>>> print(echo("Please help me I'm stuck on a mountain"))
ain
in
n
.
2.

Khi bạn làm tổ mã cụ thể cho việc sử dụng tập lệnh của tập tin của bạn theo thành ngữ

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1, thì bạn tránh chạy mã mà không liên quan đến các mô -đun nhập khẩu.

Mã làm tổ theo

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 cho phép bạn phục vụ các trường hợp sử dụng khác nhau:

  • Tập lệnh: Khi chạy dưới dạng tập lệnh, mã của bạn sẽ nhắc người dùng để nhập, gọi
    $ python echo.py
    Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
    ooo
    oo
    o
    .
    
    0 và in kết quả.
    When run as a script, your code prompts the user for input, calls
    $ python echo.py
    Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
    ooo
    oo
    o
    .
    
    0, and prints the result.
  • Mô -đun: Khi bạn nhập
    >>> from echo import echo
    >>> print(echo("Please help me I'm stuck on a mountain"))
    ain
    in
    n
    .
    
    2 dưới dạng mô -đun, thì
    $ python echo.py
    Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
    ooo
    oo
    o
    .
    
    0 sẽ được xác định, nhưng không có mã thực thi. Bạn cung cấp
    $ python echo.py
    Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
    ooo
    oo
    o
    .
    
    0 cho phiên mã chính mà không có bất kỳ tác dụng phụ nào.
    When you import
    >>> from echo import echo
    >>> print(echo("Please help me I'm stuck on a mountain"))
    ain
    in
    n
    .
    
    2 as a module, then
    $ python echo.py
    Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
    ooo
    oo
    o
    .
    
    0 gets defined, but no code executes. You provide
    $ python echo.py
    Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
    ooo
    oo
    o
    .
    
    0 to the main code session without any side effects.

Bằng cách triển khai thành ngữ

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 trong mã của bạn, bạn đã thiết lập một điểm nhập bổ sung cho phép bạn sử dụng
$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
0 ngay từ dòng lệnh.

Có bạn đi! Bây giờ bạn đã đề cập đến thông tin quan trọng nhất về chủ đề này. Tuy nhiên, có nhiều hơn nữa để tìm hiểu, và có một số sự tinh tế có thể giúp bạn xây dựng sự hiểu biết sâu sắc hơn về mã này và Python nói chung.

Đọc để tìm hiểu thêm về thành ngữ tên chính, vì hướng dẫn này sẽ nói ngắn gọn về nó.

Làm thế nào để thành ngữ tên chính hoạt động?

Tại cốt lõi của nó, thành ngữ là một câu lệnh có điều kiện kiểm tra xem giá trị của biến

# namemain.py

print(__name__, type(__name__))
1 bằng với chuỗi
# namemain.py

print(__name__, type(__name__))
2:

  • Nếu biểu thức
    $ python echo.py
    Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
    ooo
    oo
    o
    .
    
    5 là
     1# echo.py
     2
     3def echo(text: str, repetitions: int = 3) -> str:
     4    """Imitate a real-world echo."""
     5    echoed_text = ""
     6    for i in range(repetitions, 0, -1):
     7        echoed_text += f"{text[-i:]}\n"
     8    return f"{echoed_text.lower()}."
     9
    10if __name__ == "__main__":
    11    text = input("Yell something at a mountain: ")
    12    print(echo(text))
    
    5, thì mã được thụt vào sau câu lệnh có điều kiện sẽ thực thi.
  • Nếu biểu thức
    $ python echo.py
    Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
    ooo
    oo
    o
    .
    
    5 là
    # namemain.py
    
    print(__name__, type(__name__))
    
    6, thì Python bỏ qua mã thụt lề.

Nhưng khi nào

# namemain.py

print(__name__, type(__name__))
1 bằng chuỗi
# namemain.py

print(__name__, type(__name__))
2? Trong phần trước, bạn đã biết rằng đây là trường hợp khi bạn chạy tệp Python của mình dưới dạng tập lệnh từ dòng lệnh. Trong khi điều đó bao gồm hầu hết các trường hợp sử dụng thực tế, có lẽ bạn muốn đi sâu hơn.

Python đặt toàn cầu

# namemain.py

print(__name__, type(__name__))
1 của một mô-đun bằng
# namemain.py

print(__name__, type(__name__))
2 nếu trình thông dịch Python chạy mã của bạn trong môi trường mã cấp cao nhất:top-level code environment:

Mã cấp cao nhất là mô-đun Python do người dùng chỉ định đầu tiên bắt đầu chạy. Nó có giá trị cấp cao nhất vì nó nhập tất cả các mô-đun khác mà chương trình cần. (Nguồn)

Để hiểu rõ hơn điều đó có nghĩa là gì, bạn sẽ thiết lập một ví dụ nhỏ thực tế. Tạo tệp Python, gọi nó là

$ python namemain.py
__main__ <class 'str'>
1 và thêm một dòng mã:

# namemain.py

print(__name__, type(__name__))

Tệp mới của bạn chỉ chứa một dòng mã duy nhất in giá trị và loại của toàn cầu

# namemain.py

print(__name__, type(__name__))
1 vào bảng điều khiển.

Quay đầu thiết bị đầu cuối của bạn và chạy tệp Python dưới dạng tập lệnh:

$ python namemain.py
__main__ <class 'str'>

Đầu ra cho bạn thấy rằng giá trị của

# namemain.py

print(__name__, type(__name__))
1 là chuỗi Python
# namemain.py

print(__name__, type(__name__))
2 nếu bạn chạy tệp của mình dưới dạng tập lệnh.

Bây giờ bạn đã biết giá trị của

# namemain.py

print(__name__, type(__name__))
1 khi mã của bạn được thực thi trong môi trường mã cấp cao nhất.

Nhưng một tuyên bố có điều kiện chỉ có thể tạo ra kết quả khác nhau khi điều kiện có cơ hội đánh giá theo những cách khác nhau. Vì vậy, khi nào mã của bạn không chạy trong môi trường mã cấp cao nhất và điều gì xảy ra với giá trị của

# namemain.py

print(__name__, type(__name__))
1 trong trường hợp đó?

Mã trong tệp của bạn không được chạy trong môi trường mã cấp cao hơn nếu bạn nhập mô-đun của mình. Trong trường hợp đó, Python đặt

# namemain.py

print(__name__, type(__name__))
1 thành tên mô -đun.

Để thử điều này, hãy khởi động bảng điều khiển Python và nhập mã từ

$ python namemain.py
__main__ <class 'str'>
1 dưới dạng mô -đun:

>>>

>>> import namemain
namemain <class 'str'>

Trong trường hợp này, bạn muốn sử dụng

$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
0 trong bối cảnh của một phiên bản tập lệnh hoặc phiên thông dịch khác, vì vậy bạn đã thắng cần phải thu thập đầu vào của người dùng. Chạy
>>> from echo import echo
>>> print(echo("Please help me I'm stuck on a mountain"))
ain
in
n
.
1 sẽ gây rối với mã của bạn bằng cách tạo ra một tác dụng phụ khi nhập
>>> from echo import echo
>>> print(echo("Please help me I'm stuck on a mountain"))
ain
in
n
.
2.

Khi bạn làm tổ mã cụ thể cho việc sử dụng tập lệnh của tập tin của bạn theo thành ngữ

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1, thì bạn tránh chạy mã mà không liên quan đến các mô -đun nhập khẩu.

Bạn chỉ biết rằng đối với môi trường mã cấp cao nhất của bạn,

# namemain.py

print(__name__, type(__name__))
1 luôn là
# namemain.py

print(__name__, type(__name__))
2, vì vậy hãy tiếp tục và xác nhận điều đó trong phiên phiên dịch của bạn. Ngoài ra, hãy kiểm tra chuỗi
>>> import namemain
namemain <class 'str'>
2 đến từ đâu:

>>>

>>> __name__
'__main__'

>>> namemain.__name__
'namemain'

Toàn cầu

# namemain.py

print(__name__, type(__name__))
1 có giá trị
# namemain.py

print(__name__, type(__name__))
2 và
>>> import namemain
namemain <class 'str'>
8 đối với mô -đun
>>> import namemain
namemain <class 'str'>
9 đã nhập có giá trị
>>> import namemain
namemain <class 'str'>
2, là tên mô -đun dưới dạng chuỗi.

Bây giờ bạn biết rằng giá trị của

# namemain.py

print(__name__, type(__name__))
1 sẽ có một trong hai giá trị tùy thuộc vào nơi nó sống:

  • Trong môi trường mã cấp cao nhất, giá trị của
    # namemain.py
    
    print(__name__, type(__name__))
    
    1 là
    # namemain.py
    
    print(__name__, type(__name__))
    
    2.the top-level code environment, the value of
    # namemain.py
    
    print(__name__, type(__name__))
    
    1 is
    # namemain.py
    
    print(__name__, type(__name__))
    
    2
    .
  • Trong một mô -đun đã nhập, giá trị của
    # namemain.py
    
    print(__name__, type(__name__))
    
    1 là tên mô -đun dưới dạng chuỗi.imported module, the value of
    # namemain.py
    
    print(__name__, type(__name__))
    
    1 is the module’s name as a string.

Bởi vì Python tuân theo các quy tắc này, bạn có thể tìm hiểu xem một mô-đun có chạy trong môi trường mã cấp cao nhất hay không. Bạn làm điều này bằng cách kiểm tra giá trị của

# namemain.py

print(__name__, type(__name__))
1 bằng một câu lệnh có điều kiện, đưa bạn đến vòng tròn đầy đủ cho tên thành ngữ tên chính:

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
0

Với việc kiểm tra có điều kiện này, bạn có thể khai báo mã chỉ thực thi khi mô-đun được chạy trong môi trường mã cấp cao nhất.

Thêm thành ngữ vào

$ python namemain.py
__main__ <class 'str'>
1 như được hiển thị trong khối mã ở trên, sau đó chạy tệp dưới dạng tập lệnh một lần nữa:

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
1

Khi chạy mã của bạn dưới dạng tập lệnh, cả hai gọi đến

>>> __name__
'__main__'

>>> namemain.__name__
'namemain'
7 execute.

Tiếp theo, hãy bắt đầu một phiên phiên dịch mới và nhập

>>> import namemain
namemain <class 'str'>
9 làm mô -đun một lần nữa:

>>>

>>> import namemain
namemain <class 'str'>

Toàn cầu

# namemain.py

print(__name__, type(__name__))
1 có giá trị
# namemain.py

print(__name__, type(__name__))
2 và
>>> import namemain
namemain <class 'str'>
8 đối với mô -đun
>>> import namemain
namemain <class 'str'>
9 đã nhập có giá trị
>>> import namemain
namemain <class 'str'>
2, là tên mô -đun dưới dạng chuỗi.

Bây giờ bạn biết rằng giá trị của

# namemain.py

print(__name__, type(__name__))
1 sẽ có một trong hai giá trị tùy thuộc vào nơi nó sống:

Trong môi trường mã cấp cao nhất, giá trị của # namemain.py print(__name__, type(__name__)) 1 là # namemain.py print(__name__, type(__name__)) 2.

Trong một mô -đun đã nhập, giá trị của

# namemain.py

print(__name__, type(__name__))
1 là tên mô -đun dưới dạng chuỗi.

Bởi vì Python tuân theo các quy tắc này, bạn có thể tìm hiểu xem một mô-đun có chạy trong môi trường mã cấp cao nhất hay không. Bạn làm điều này bằng cách kiểm tra giá trị của

# namemain.py

print(__name__, type(__name__))
1 bằng một câu lệnh có điều kiện, đưa bạn đến vòng tròn đầy đủ cho tên thành ngữ tên chính:

Với việc kiểm tra có điều kiện này, bạn có thể khai báo mã chỉ thực thi khi mô-đun được chạy trong môi trường mã cấp cao nhất.

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
3

Thêm thành ngữ vào

$ python namemain.py
__main__ <class 'str'>
1 như được hiển thị trong khối mã ở trên, sau đó chạy tệp dưới dạng tập lệnh một lần nữa:

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
4

Khi chạy mã của bạn dưới dạng tập lệnh, cả hai gọi đến

>>> __name__
'__main__'

>>> namemain.__name__
'namemain'
7 execute.

Tiếp theo, hãy bắt đầu một phiên phiên dịch mới và nhập

>>> import namemain
namemain <class 'str'>
9 làm mô -đun một lần nữa:

Khi bạn nhập tệp của mình dưới dạng mô -đun, mã mà bạn lồng vào

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 không thực thi.

Bây giờ bạn đã biết cách thức thành ngữ tên chính trong Python, bạn có thể tự hỏi khi nào và chính xác bạn nên sử dụng nó trong mã của mình và khi nào nên tránh nó!

Khi nào bạn nên sử dụng thành ngữ tên chính trong Python?

Bạn sử dụng thành ngữ này khi bạn muốn tạo một điểm nhập bổ sung cho tập lệnh của mình, để tệp của bạn có thể truy cập dưới dạng tập lệnh độc lập cũng như một mô-đun có thể nhập. Bạn có thể muốn điều đó khi tập lệnh của bạn cần thu thập đầu vào của người dùng.

Trong phần đầu tiên của hướng dẫn này, bạn đã sử dụng thành ngữ tên chính cùng với >>> from echo import echo >>> print(echo("Please help me I'm stuck on a mountain")) ain in n . 1 để thu thập đầu vào của người dùng khi chạy $ python echo.py Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO ooo oo o . 4 dưới dạng tập lệnh. Đó là một lý do tuyệt vời để sử dụng thành ngữ tên chính!

Ngoài ra còn có các cách khác để thu thập đầu vào người dùng trực tiếp từ dòng lệnh. Ví dụ: bạn có thể tạo một điểm nhập dòng lệnh cho một tập lệnh Python nhỏ với

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
02 và tên thành ngữ tên chính:

Thay vì thu thập đầu vào của người dùng với

>>> from echo import echo
>>> print(echo("Please help me I'm stuck on a mountain"))
ain
in
n
.
1, bạn đã thay đổi mã trong
$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
4 để người dùng của bạn có thể cung cấp văn bản dưới dạng đối số trực tiếp từ dòng lệnh:test runs to a script that combines code functionality and tests in the same file:

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
5

Python thu thập một số từ tùy ý vào

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
02, đây là danh sách các chuỗi đại diện cho tất cả các đầu vào. Mỗi từ được coi là một đối số mới khi một ký tự khoảng trắng tách nó ra với các từ khác.

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
6

Bằng cách thực hiện mã xử lý đầu vào của người dùng và làm tổ trong tên thành ngữ tên chính, bạn cung cấp một điểm nhập bổ sung cho tập lệnh của bạn.

Nếu bạn muốn tạo một điểm nhập cảnh cho một gói, thì bạn nên tạo một tệp

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
06 chuyên dụng cho mục đích đó. Tệp này đại diện cho một điểm nhập cảnh Python gọi khi bạn chạy gói của mình bằng tùy chọn
import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
07:

>>>

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
7

Khi bạn tạo môi trường ảo bằng mô -đun

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
08, như được hiển thị ở trên, thì bạn chạy mã được xác định trong tệp
import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
06. Tùy chọn
import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
07 theo sau là tên mô -đun
import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
08 gọi
import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
06 từ mô -đun
import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
08.

Mặc dù điều này hoạt động cho các tệp nhỏ, nhưng nó thường không được coi là thực hành tốt. Nó không nên trộn các bài kiểm tra và mã trong cùng một tệp. Thay vào đó, hãy viết các bài kiểm tra của bạn trong một tệp riêng biệt. Theo lời khuyên này thường làm cho một cơ sở mã có tổ chức hơn. Cách tiếp cận này cũng loại bỏ bất kỳ chi phí nào, chẳng hạn như nhu cầu nhập

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
21 trong tệp tập lệnh chính của bạn.

Một lý do khác mà một số lập trình viên sử dụng thành ngữ tên chính là bao gồm một minh chứng cho những gì mã của họ có thể làm:demonstration of what their code can do:

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
8

Một lần nữa, người dùng của bạn vẫn có thể nhập mô -đun mà không có bất kỳ tác dụng phụ nào. Ngoài ra, khi họ chạy

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
22 dưới dạng tập lệnh, họ sẽ xem qua chức năng của nó:

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
9

Bạn có thể tìm thấy các thực thi mã demo như vậy trong tên thành ngữ tên chính, nhưng có những cách tốt hơn được cho là để chứng minh cách sử dụng chương trình của bạn. Bạn có thể viết các tài liệu chi tiết với các lần chạy ví dụ có thể tăng gấp đôi dưới dạng tài liệu và bạn có thể soạn thảo tài liệu phù hợp cho dự án của mình.

Hai ví dụ trước đây bao gồm hai trường hợp sử dụng dưới mức tối ưu phổ biến của thành ngữ tên chính. Ngoài ra còn có các kịch bản khác khi nó tốt nhất để tránh thành ngữ chính trong Python:

  • Một tập lệnh thuần túy: Nếu bạn viết một tập lệnh mà Lừa có nghĩa là được chạy dưới dạng tập lệnh, thì bạn có thể đặt quá trình thực thi mã của mình vào không gian tên toàn cầu mà không cần làm tổ trong tên thành ngữ tên chính. Bạn có thể sử dụng Python làm ngôn ngữ kịch bản vì nó không thực thi các mẫu hướng đối tượng mạnh mẽ. Bạn không cần phải gắn bó với các mẫu thiết kế từ các ngôn ngữ khác khi bạn lập trình bằng Python. If you write a script that’s meant to be run as a script, then you can put your code execution into the global namespace without nesting it in the name-main idiom. You can use Python as a scripting language because it doesn’t enforce strong object-oriented patterns. You don’t have to stick to design patterns from other languages when you program in Python.

  • Một chương trình dòng lệnh phức tạp: Nếu bạn viết một ứng dụng dòng lệnh lớn hơn, thì tốt nhất là tạo một tệp riêng làm điểm nhập của bạn. Sau đó, bạn nhập mã từ mô-đun của mình ở đó thay vì xử lý đầu vào của người dùng với thành ngữ tên chính. Đối với các chương trình dòng lệnh phức tạp hơn, bạn cũng sẽ được hưởng lợi từ việc sử dụng mô-đun

     1if __name__ == "__main__":
     2    ...
    
    8 tích hợp thay vì
    import argparse
    
    # other code. . .
    
    def main(name):
        print('Hello, %s!' % name)
    
    if __name__ == '__main__':
        parser = argparse.ArgumentParser(description = 'Say hello')
        parser.add_argument('name', help='your name, enter it')
        args = parser.parse_args()
    
        main(args.name)
    
    02.
    If you write a larger command-line application, then it’s best to create a separate file as your entry point. You then import the code from your module there instead of handling user input with the name-main idiom. For more complex command-line programs, you’ll also benefit from using the built-in
     1if __name__ == "__main__":
     2    ...
    
    8 module instead of
    import argparse
    
    # other code. . .
    
    def main(name):
        print('Hello, %s!' % name)
    
    if __name__ == '__main__':
        parser = argparse.ArgumentParser(description = 'Say hello')
        parser.add_argument('name', help='your name, enter it')
        args = parser.parse_args()
    
        main(args.name)
    
    02.

Có lẽ bạn đã sử dụng thành ngữ chính tên cho một trong những mục đích dưới mức tối ưu này trước đây. Nếu bạn muốn tìm hiểu thêm về cách viết thêm Python thành ngữ cho từng kịch bản này, thì hãy làm theo các liên kết được cung cấp:

Mặc dù bây giờ bạn biết khi nào nên tránh thành ngữ chính tên, bạn vẫn có thể tự hỏi về cách sử dụng tốt nhất trong một kịch bản hợp lệ.

Theo cách nào bạn nên bao gồm thành ngữ tên chính?

Thành ngữ tên chính trong Python chỉ là một tuyên bố có điều kiện, vì vậy bạn có thể sử dụng nó ở bất cứ đâu trong tập tin của bạn ngay cả hơn một lần! Tuy nhiên, đối với hầu hết các trường hợp sử dụng, bạn sẽ đặt một thành ngữ chính tên ở cuối tập lệnh của bạn:

 1if __name__ == "__main__":
 2    ...
0

Bạn đặt tên thành ngữ tên chính ở cuối tập lệnh của bạn vì điểm nhập cho tập lệnh Python luôn là đỉnh của tệp. Nếu bạn đặt thành ngữ tên chính ở cuối tệp của bạn, thì tất cả các chức năng và lớp của bạn sẽ được xác định trước khi Python đánh giá biểu thức có điều kiện.

Tuy nhiên, mặc dù nó không phổ biến khi sử dụng nhiều hơn một tên thành ngữ chính trong một kịch bản, nhưng có thể có một lý do để làm như vậy trong một số trường hợp. Tài liệu hướng dẫn kiểu Python, PEP 8, rõ ràng nơi đặt tất cả các báo cáo nhập của bạn:

Nhập khẩu luôn được đặt ở đầu tệp, ngay sau khi bất kỳ bình luận và tài liệu mô -đun nào, và trước khi mô -đun toàn cầu và hằng số. (Nguồn)

Đây là lý do tại sao bạn đã nhập

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
25 ở đầu tệp trong
$ python echo.py
Yell something at a mountain: HELLOOOO ECHOOOOOOOOOO
ooo
oo
o
.
4:

 1if __name__ == "__main__":
 2    ...
1

Tuy nhiên, bạn không cần phải nhập

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
25 khi bạn chỉ muốn nhập
>>> from echo import echo
>>> print(echo("Please help me I'm stuck on a mountain"))
ain
in
n
.
2 dưới dạng mô -đun.

Để giải quyết vấn đề này và vẫn gắn bó với các đề xuất phong cách được xác định trong PEP 8, bạn có thể sử dụng thành ngữ tên chính tên thứ hai. Bằng cách làm tổ việc nhập

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
25 trong một thành ngữ chính tên, bạn có thể giữ tất cả các lần nhập ở đầu tệp nhưng tránh nhập
import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
25 khi bạn giành được thành công cần sử dụng nó:

 1if __name__ == "__main__":
 2    ...
2

Bạn đã lồng vào việc nhập

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
25 dưới một thành ngữ chính tên khác. Bằng cách đó, bạn giữ câu lệnh nhập ở đầu tệp của mình, nhưng bạn tránh nhập
import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
25 khi bạn sử dụng
>>> from echo import echo
>>> print(echo("Please help me I'm stuck on a mountain"))
ain
in
n
.
2 làm mô -đun.

Như bạn đã học trước đó trong hướng dẫn, có ít trường hợp sử dụng thành ngữ tên chính hơn bạn mong đợi. Đối với hầu hết các trường hợp sử dụng đó, việc đặt một trong những kiểm tra có điều kiện này ở cuối tập lệnh của bạn sẽ là lựa chọn tốt nhất của bạn.

Cuối cùng, bạn có thể tự hỏi mã nào sẽ đi vào khối mã có điều kiện. Tài liệu Python cung cấp hướng dẫn rõ ràng về việc sử dụng thành ngữ của thành ngữ tên chính trong vấn đề đó:

Đặt càng ít câu lệnh càng tốt trong khối bên dưới

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)
34 có thể cải thiện độ rõ và tính đúng của mã. (Nguồn)

Giữ mã dưới tên của bạn ở vị trí chính của bạn ở mức tối thiểu! Khi bạn bắt đầu đặt nhiều dòng mã lồng nhau theo thành ngữ tên chính, thì thay vào đó, bạn nên xác định hàm

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
3 và gọi hàm đó:

 1if __name__ == "__main__":
 2    ...
3

Mẫu thiết kế này cung cấp cho bạn lợi thế rằng mã dưới tên thành ngữ tên chính là rõ ràng và súc tích. Ngoài ra, nó có thể gọi

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
3 ngay cả khi bạn đã nhập mã của mình dưới dạng mô -đun, ví dụ như để kiểm tra đơn vị các chức năng của nó.

Trong phần này, bạn đã học được rằng có lẽ bạn nên viết tên thành ngữ tên chính ở cuối kịch bản của bạn.

Nếu bạn có nhiều dòng mã mà bạn có kế hoạch làm tổ theo

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1, thì tốt hơn hết là bạn nên tái cấu trúc mã đó thành hàm
 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
3 mà bạn gọi từ khối có điều kiện theo tên thành ngữ tên chính.

Bây giờ bạn đã biết làm thế nào bạn có thể sử dụng thành ngữ tên chính, bạn có thể tự hỏi tại sao nó trông khó hiểu hơn mã Python khác mà bạn đã từng sử dụng.

Là mã Boilerplate thành ngữ nên được đơn giản hóa?

Nếu bạn đến từ một ngôn ngữ lập trình hướng đối tượng khác, bạn có thể nghĩ rằng thành ngữ chính tên của Python là một điểm nhập cảnh giống với các chức năng ____33 trong Java hoặc C, nhưng Clumsier:

Hướng dẫn python argparse if __name__ == __main__ - python argparse nếu __name__ == __main__
Meme dựa trên một truyện tranh web (Hình ảnh: Mike Organisciak)

Mặc dù chắc chắn hài hước và dễ hiểu, meme này là sai lệch vì nó ngụ ý rằng thành ngữ tên chính có thể so sánh với các hàm điểm nhập

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
3 trong các ngôn ngữ khác.

Tên của Python tên chính là đặc biệt. Nó chỉ là một kiểm tra có điều kiện. Lúc đầu, nó có thể trông khó hiểu, đặc biệt là khi bạn bắt đầu làm việc với Python và bạn đã từng sử dụng để cú pháp Slim và thanh lịch của Python. Rốt cuộc, thành ngữ tên chính bao gồm một biến số ít từ không gian tên toàn cầu và một chuỗi cũng có giá trị khó chịu.

Vì vậy, nó không phải là loại điểm vào mà chính đại diện trong các ngôn ngữ khác. Nhưng tại sao nó trông giống như nó? Bạn có thể đã sao chép và dán thành ngữ nhiều lần, hoặc thậm chí gõ nó ra, và tự hỏi tại sao Python không có cú pháp ngắn gọn hơn cho nó.

Nếu bạn duyệt các tài liệu lưu trữ của danh sách gửi thư Python-Ideas, PEPS đã từ chối và Diễn đàn thảo luận Python, thì bạn sẽ tìm thấy một số nỗ lực để thay đổi thành ngữ.

Nếu bạn đọc một số cuộc thảo luận này, thì bạn sẽ nhận thấy rằng nhiều Pythonistas dày dạn lập luận rằng thành ngữ đó là mật mã và không nên thay đổi. Họ đưa ra nhiều lý do:

  • Nó ngắn: Hầu hết các thay đổi được đề xuất chỉ tiết kiệm hai dòng mã. Most suggested changes save only two lines of code.
  • Nó có một trường hợp sử dụng hạn chế: Bạn chỉ nên sử dụng nó nếu bạn cần chạy một tệp cả dưới dạng mô -đun cũng như tập lệnh. Bạn không cần phải sử dụng nó rất thường xuyên. You should only use it if you need to run a file both as a module as well as a script. You shouldn’t need to use it very often.
  • Nó phơi bày sự phức tạp: Các biến và chức năng của Dunder là một phần lớn của Python một khi bạn nhìn sâu hơn một chút. Điều đó có thể làm cho thành ngữ hiện tại trở thành một điểm nhập cảnh cho những người học gây ra sự tò mò và mang đến cho họ cái nhìn đầu tiên dưới mui xe của cú pháp Python. Dunder variables and function are a big part of Python once you peek a bit deeper. That can make the current idiom an entry point for learners that sparks curiosity and gives them a first look under the hood of Python’s syntax.
  • Nó duy trì khả năng tương thích ngược: Tên thành ngữ tên chính là một tiêu chuẩn thực tế trong ngôn ngữ trong một thời gian dài, điều đó có nghĩa là việc thay đổi nó sẽ phá vỡ khả năng tương thích ngược. The name-main idiom has been a de facto standard in the language for a long time, which means that changing it would break backward compatibility.

Được rồi, vì vậy bạn đã bị mắc kẹt với

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 trong thời gian này. Có vẻ như nó rất hữu ích khi tìm ra một cách tốt để đề cập đến nó một cách nhất quán và chính xác!

Mở rộng phần dưới đây cho một chút bối cảnh và một vài gợi ý về cách bạn có thể nói về thành ngữ tên chính mà không vặn lưỡi hoặc thắt nút ngón tay của bạn:

Bạn có thể thảo luận về việc sử dụng thành ngữ tên chính tại một số điểm trong sự nghiệp Python của bạn. Nó có một biểu hiện dài để viết và thậm chí còn cồng kềnh hơn để nói to, vì vậy bạn cũng có thể tìm thấy một cách tốt để nói về nó.

Có nhiều cách khác nhau để đề cập đến nó trong cộng đồng Python. Hầu hết các đề cập trực tuyến bao gồm toàn bộ biểu thức

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 theo sau là một từ:

  • Công ước
     1# echo.py
     2
     3def echo(text: str, repetitions: int = 3) -> str:
     4    """Imitate a real-world echo."""
     5    echoed_text = ""
     6    for i in range(repetitions, 0, -1):
     7        echoed_text += f"{text[-i:]}\n"
     8    return f"{echoed_text.lower()}."
     9
    10if __name__ == "__main__":
    11    text = input("Yell something at a mountain: ")
    12    print(echo(text))
    
    1 (Nguồn)
  • Biểu thức
     1# echo.py
     2
     3def echo(text: str, repetitions: int = 3) -> str:
     4    """Imitate a real-world echo."""
     5    echoed_text = ""
     6    for i in range(repetitions, 0, -1):
     7        echoed_text += f"{text[-i:]}\n"
     8    return f"{echoed_text.lower()}."
     9
    10if __name__ == "__main__":
    11    text = input("Yell something at a mountain: ")
    12    print(echo(text))
    
    1 (Nguồn)
  • Thành ngữ
    import argparse
    
    # other code. . .
    
    def main(name):
        print('Hello, %s!' % name)
    
    if __name__ == '__main__':
        parser = argparse.ArgumentParser(description = 'Say hello')
        parser.add_argument('name', help='your name, enter it')
        args = parser.parse_args()
    
        main(args.name)
    
    45 (Nguồn)
  • Thành ngữ
    import argparse
    
    # other code. . .
    
    def main(name):
        print('Hello, %s!' % name)
    
    if __name__ == '__main__':
        parser = argparse.ArgumentParser(description = 'Say hello')
        parser.add_argument('name', help='your name, enter it')
        args = parser.parse_args()
    
        main(args.name)
    
    46 (Nguồn)
  • Thành ngữ
     1# echo.py
     2
     3def echo(text: str, repetitions: int = 3) -> str:
     4    """Imitate a real-world echo."""
     5    echoed_text = ""
     6    for i in range(repetitions, 0, -1):
     7        echoed_text += f"{text[-i:]}\n"
     8    return f"{echoed_text.lower()}."
     9
    10if __name__ == "__main__":
    11    text = input("Yell something at a mountain: ")
    12    print(echo(text))
    
    1 (Nguồn)
  • Khổ thơ thực thi (nguồn)

Như bạn có thể nhận thấy, không có quy ước nghiêm ngặt nào xung quanh cách nói về

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1, nhưng có lẽ bạn đã giành được sai nếu bạn tuân theo sự đồng thuận chung khi gọi nó là thành ngữ
 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1.the
 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 idiom
.

Nếu bạn muốn quảng bá tiêu chuẩn hóa một tên ngắn hơn cho thành ngữ, thì hãy nói với bạn bè của bạn gọi nó là thành ngữ tên chính. Đó là những gì chúng tôi sẽ gọi nó tại Real Python! Nếu bạn thấy thuật ngữ hữu ích, thì có lẽ nó sẽ bắt kịp.the name-main idiom. That’s what we’ll be calling it at Real Python! If you find the term useful, then maybe it’ll catch on.

Nếu bạn tò mò, hãy lao vào một số cuộc thảo luận được liên kết trong các kênh cộng đồng Python khác nhau để tìm hiểu thêm về lý do tại sao các nhà phát triển tranh luận về việc giữ tên thành ngữ tên chính như vậy.

Sự kết luận

Bạn đã học được những gì thành ngữ

 1# echo.py
 2
 3def echo(text: str, repetitions: int = 3) -> str:
 4    """Imitate a real-world echo."""
 5    echoed_text = ""
 6    for i in range(repetitions, 0, -1):
 7        echoed_text += f"{text[-i:]}\n"
 8    return f"{echoed_text.lower()}."
 9
10if __name__ == "__main__":
11    text = input("Yell something at a mountain: ")
12    print(echo(text))
1 làm trong Python. Nó cho phép bạn viết mã thực thi khi bạn chạy tệp dưới dạng tập lệnh, nhưng không phải khi bạn nhập nó dưới dạng mô -đun. Nó tốt nhất để sử dụng nó khi bạn muốn thu thập đầu vào của người dùng trong quá trình chạy tập lệnh và tránh các tác dụng phụ khi nhập mô -đun của bạn, ví dụ, để kiểm tra các chức năng của nó.

Bạn cũng đã biết một số trường hợp sử dụng phổ biến nhưng dưới mức tối ưu và tìm hiểu về các phương pháp tốt hơn và thành ngữ hơn mà bạn có thể thực hiện trong các kịch bản đó.Có lẽ bạn đã chấp nhận thành ngữ chính tên của Python, sau khi tìm hiểu thêm về nó, nhưng nếu bạn vẫn không thích nó, thì thật tốt khi biết rằng bạn có thể thay thế việc sử dụng nó trong hầu hết các trường hợp.

Khi nào bạn sử dụng thành ngữ tên chính trong mã Python của bạn?Trong khi đọc hướng dẫn này, bạn đã khám phá ra một cách để thay thế nó, hoặc có một trường hợp sử dụng tốt mà chúng tôi đã bỏ lỡ?Chia sẻ suy nghĩ của bạn trong các ý kiến dưới đây.