Rất có thể bạn đã thấy biến __name__
khi bạn xem qua mã Python. Dưới đây bạn thấy một đoạn mã ví dụ về giao diện của nó
if __name__ == '__main__': main[]
Trong bài viết này, tôi muốn chỉ cho bạn cách bạn có thể sử dụng biến này để tạo các mô-đun trong Python
Tại sao biến _ _name_ _ được sử dụng?
Biến __name__
[hai dấu gạch dưới trước và sau] là một biến Python đặc biệt. Nó nhận được giá trị của nó tùy thuộc vào cách chúng tôi thực thi tập lệnh chứa
Đôi khi bạn viết một tập lệnh với các chức năng cũng có thể hữu ích trong các tập lệnh khác. Trong Python, bạn có thể nhập tập lệnh đó dưới dạng mô-đun trong tập lệnh khác
Nhờ biến đặc biệt này, bạn có thể quyết định xem mình có muốn chạy tập lệnh hay không. Hoặc bạn muốn nhập các chức năng được xác định trong tập lệnh
Biến __name__ có thể chứa những giá trị nào?
Khi bạn chạy tập lệnh của mình, biến __name__
bằng __main__
. Khi bạn nhập tập lệnh chứa, nó sẽ chứa tên của tập lệnh
Chúng ta hãy xem xét hai trường hợp sử dụng này và mô tả quy trình bằng hai hình minh họa
Tình huống 1 - Chạy tập lệnh
Giả sử chúng tôi đã viết kịch bản
def myFunction[]: print 'The value of __name__ is ' + __name__
0 như saudef myFunction[]: print 'The value of __name__ is ' + __name__
def main[]: myFunction[]
if __name__ == '__main__': main[]
Nếu bạn chạy nameScript. py, quá trình dưới đây được thực hiện
Trước khi tất cả các mã khác được chạy, biến __name__
được đặt thành __main__. Sau đó, các câu lệnh def
def myFunction[]: print 'The value of __name__ is ' + __name__
2 và def myFunction[]: print 'The value of __name__ is ' + __name__
3 được chạy. Bởi vì điều kiện đánh giá là đúng, chức năng chính được gọi. Đến lượt mình, điều này gọi myFunction. Điều này in ra giá trị của __main__
Tình huống 2 - Nhập tập lệnh vào một tập lệnh khác
Nếu chúng tôi muốn sử dụng lại myFunction trong một tập lệnh khác, ví dụ như
def myFunction[]: print 'The value of __name__ is ' + __name__
5, chúng tôi có thể nhập def myFunction[]: print 'The value of __name__ is ' + __name__
0 làm mô-đunMã trong
def myFunction[]: print 'The value of __name__ is ' + __name__
5 có thể như sauimport nameScript as ns
ns.myFunction[]
Sau đó chúng tôi có hai phạm vi. một trong số
def myFunction[]: print 'The value of __name__ is ' + __name__
8 và phạm vi thứ hai của def myFunction[]: print 'The value of __name__ is ' + __name__
9. Trong hình minh họa, bạn sẽ thấy nó khác với trường hợp sử dụng đầu tiên như thế nàoTrong importScript. py biến __name__
được đặt thành __main__. Bằng cách nhập nameScript, Python bắt đầu tìm kiếm tệp bằng cách thêm
def main[]: myFunction[]
1 vào tên mô-đun. Sau đó, nó chạy mã có trong tệp đã nhậpNhưng lần này nó được đặt thành nameScript. Một lần nữa các câu lệnh def cho main và myFunction được chạy. Nhưng, bây giờ điều kiện đánh giá là sai và chính không được gọi
Trong importScript. py chúng tôi gọi myFunction sẽ xuất ra nameScript. NameScript được biết đến với myFunction khi chức năng đó được xác định
Nếu bạn in __name__
trong bản nhập khẩu, điều này sẽ xuất ra __main__
. Lý do cho điều này là Python sử dụng giá trị đã biết trong phạm vi của importScript
Phần kết luận
Trong bài viết ngắn này, tôi đã giải thích cách bạn có thể sử dụng biến __name__
để viết các mô-đun. Bạn cũng có thể tự chạy các mô-đun này. Điều này có thể được thực hiện bằng cách sử dụng giá trị của các biến này thay đổi như thế nào tùy thuộc vào nơi chúng xuất hiện.
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
Nhà khoa học dữ liệu
Nếu bài viết này hữu ích, hãy tweet nó
Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu
Bài đăng này thảo luận về việc sử dụng ký tự _
trong Python. Giống như nhiều thứ trong Python, chúng ta sẽ thấy rằng các cách sử dụng khác nhau của _
hầu hết [không phải lúc nào cũng. ] một vấn đề của quy ước
Điều này thường được sử dụng trong 3 trường hợp
trong thông dịch viên. Tên
_
trỏ đến kết quả của câu lệnh được thực thi cuối cùng trong phiên phiên dịch tương tác. Điều này lần đầu tiên được thực hiện bởi trình thông dịch CPython tiêu chuẩn và những người khác cũng đã làm theo>>> _ Traceback [most recent call last]: File "", line 1, in NameError: name '_' is not defined >>> 42 >>> _ 42 >>> 'alright!' if _ else ':[' 'alright!' >>> _ 'alright!'
như một cái tên. Điều này phần nào liên quan đến điểm trước.
_
được sử dụng như một cái tên bỏ đi. Điều này sẽ cho phép người tiếp theo đọc mã của bạn biết rằng, theo quy ước, một tên nhất định được gán nhưng không có ý định sử dụng. Chẳng hạn, bạn có thể không quan tâm đến giá trị thực của bộ đếm vòng lặpn = 42 for _ in range[n]: do_something[]
i18n. Người ta cũng có thể thấy
_
được sử dụng như một chức năng. Trong trường hợp đó, nó thường là tên được sử dụng cho hàm thực hiện tra cứu dịch chuỗi quốc tế hóa và bản địa hóa. Điều này dường như bắt nguồn từ và tuân theo quy ước C tương ứng
Chẳng hạn, như đã thấy trong tài liệu dịch Django, bạn có thể cófrom django.utils.translation import ugettext as _ from django.http import HttpResponse def my_view[request]: output = _["Welcome to my site."] return HttpResponse[output]
Mục đích thứ hai và thứ ba có thể xung đột, vì vậy người ta nên tránh sử dụng _
như một cái tên vứt đi trong bất kỳ khối mã nào cũng sử dụng nó để tra cứu và dịch i18n
n = 42
for _ in range[n]:
do_something[]
3]Một dấu gạch dưới trước một tên được sử dụng để xác định rằng tên đó sẽ được một lập trình viên coi là "riêng tư". Đó là một loại* quy ước để người tiếp theo [hoặc chính bạn] sử dụng mã của bạn biết rằng tên bắt đầu bằng _
là dành cho mục đích sử dụng nội bộ. Như
một tên bắt đầu bằng dấu gạch dưới [e. g.
5] nên được coi là một phần không công khai của API [cho dù đó là một hàm, một phương thức hay một thành viên dữ liệu]. Nó nên được coi là một chi tiết thực hiện và có thể thay đổi mà không cần thông báon = 42 for _ in range[n]: do_something[]
* Tôi nói loại quy ước bởi vì nó thực sự có ý nghĩa gì đó đối với người phiên dịch; . Xem “Nhập
n = 42
for _ in range[n]:
do_something[]
9 bằng Python” để biết thêm về điều nàyDấu gạch dưới kép trước tên [e. g. from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
0]Việc sử dụng dấu gạch dưới kép [
from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
1] trước tên [cụ thể là tên phương thức] không phải là quy ước; . Python sắp xếp các tên này và nó được sử dụng để tránh xung đột tên với các tên được xác định bởi các lớp con. Vì , bất kỳ mã định danh nào có dạng from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
2 [ít nhất hai dấu gạch dưới ở đầu, nhiều nhất là một dấu gạch dưới ở cuối] được thay thế bằng văn bản bằng from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
3, trong đó from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
4 là tên lớp hiện tại với [các] dấu gạch dưới ở đầu bị loại bỏLấy ví dụ sau
>>> class A[object]:
.. def _internal_use[self]:
.. pass
.. def __method_name[self]:
.. pass
..
>>> dir[A[]]
['_A__method_name', ..., '_internal_use']
Đúng như mong đợi,
from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
5 không thay đổi nhưng from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
6 bị xáo trộn thành from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
7. Bây giờ, nếu bạn tạo một lớp con của from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
8, hãy nói from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
9 [argh, bad, bad names. ] thì bạn không thể dễ dàng ghi đè lên from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
6 của from django.utils.translation import ugettext as _
from django.http import HttpResponse
def my_view[request]:
output = _["Welcome to my site."]
return HttpResponse[output]
8>>> class B[A]:
.. def __method_name[self]:
.. pass
..
>>> dir[B[]]
['_A__method_name', '_B__method_name', ..., '_internal_use']
Hành vi dự định ở đây gần như tương đương với các phương thức
>>> class A[object]:
.. def _internal_use[self]:
.. pass
.. def __method_name[self]:
.. pass
..
>>> dir[A[]]
['_A__method_name', ..., '_internal_use']
2 trong Java và các phương thức thông thường [không ảo] trong C++Dấu gạch dưới kép trước và sau tên [e. g. >>> class A[object]:
.. def _internal_use[self]:
.. pass
.. def __method_name[self]:
.. pass
..
>>> dir[A[]]
['_A__method_name', ..., '_internal_use']
3]Chúng được sử dụng bởi Python. Đối với một người, đây chỉ là một quy ước, một cách để hệ thống Python sử dụng các tên không xung đột với tên do người dùng xác định. Sau đó, bạn thường ghi đè các phương thức này và xác định hành vi mong muốn khi Python gọi chúng. Ví dụ: bạn thường ghi đè phương thức
>>> class A[object]:
.. def _internal_use[self]:
.. pass
.. def __method_name[self]:
.. pass
..
>>> dir[A[]]
['_A__method_name', ..., '_internal_use']
3 khi viết một lớpKhông có gì ngăn cản bạn viết tên trông giống như phương pháp đặc biệt của riêng bạn [nhưng, vui lòng không]
>>> class C[object]:
.. def __mine__[self]:
.. pass
...
>>> dir[C]
.. [..., '__mine__', ...]
Việc tránh xa kiểu đặt tên này sẽ dễ dàng hơn và chỉ để các tên đặc biệt do Python xác định tuân theo quy ước này