Dấu gạch dưới [_] không phải là một ký tự đơn giản trong Python. Mặc dù ở hầu hết các ngôn ngữ, nó chỉ được sử dụng để đặt tên cho các hàm và biến trong trường hợp con rắn, nhưng trong Python, nó được sử dụng rộng rãi hơn nhiều. Rất có thể, bạn đã thấy các cấu trúc cho _ trong phạm vi [10] hoặc __init __ [bản thân]
Trong chương này, chúng ta sẽ thảo luận về năm mẫu dấu gạch dưới và quy ước đặt tên, cũng như cách chúng ảnh hưởng đến hành vi của các chương trình Python của bạn
- Để lưu trữ giá trị cuối cùng trong REPL [Đọc, Đánh giá, In, Lặp lại]
- Để bỏ qua các giá trị không quan trọng
- Để gán một giá trị đặc biệt cho một hàm hoặc biến
- Là bí danh cho các chức năng quốc tế hóa và bản địa hóa
- Tách số thành chữ số
Và bây giờ hãy xem xét từng mục danh sách chi tiết hơn
Dấu gạch dưới trong Python REPL
Trình thông dịch ở chế độ tương tác lưu trữ giá trị được tính cuối cùng trong một biến đặc biệt _. Tính năng này xuất hiện lần đầu trong CPython, nhưng hiện đã được hỗ trợ bởi tất cả các trình thông dịch chính
>>> 10
10
>>> _
10
>>> _ * 3
30
>>> _ * 20
600
Biến gạch dưới Python
Dấu gạch dưới cũng được sử dụng để bỏ qua các giá trị. Nếu bạn không muốn sử dụng một số giá trị - hãy gán giá trị đó cho biến _
Trong ví dụ mã sau, chúng tôi giải nén số từ bộ trong các biến riêng biệt
Nhưng ví dụ, chúng tôi chỉ quan tâm đến các giá trị đầu tiên và cuối cùng. Tuy nhiên, để biểu thức giải nén thành công, tôi cần gán tất cả các giá trị có trong bộ cho các biến
# ignore when unpacking______5
x, _, _, y = [1, 2, 3, 4] # x = 1, y = 4
# ignore the index
for _ in range[10]:
do_something[]
# or some specific value
for _, val in list_of_tuple:
do_something[]
Dấu gạch dưới thường được sử dụng nhất trong việc đặt tên. PEP8 mô tả 4 trường hợp sử dụng dấu gạch dưới trong tên
Dấu gạch dưới hàng đầu đơn. “_var”
Khi nói đến tên biến và phương thức, tiền tố gạch dưới đơn chỉ có nghĩa theo quy ước. Đó là một gợi ý cho lập trình viên — nó có nghĩa là những gì cộng đồng Python đồng ý, nhưng nó không ảnh hưởng đến hành vi của các chương trình của bạn
Tiền tố gạch dưới có nghĩa là một gợi ý để nói với một lập trình viên khác rằng một biến hoặc phương thức bắt đầu bằng một dấu gạch dưới duy nhất được dùng cho mục đích sử dụng nội bộ. Quy ước này được định nghĩa trong PEP 8, hướng dẫn kiểu mã Python được sử dụng phổ biến nhất
Hãy xem ví dụ sau
________số 8Điều gì sẽ xảy ra nếu bạn khởi tạo lớp Cơ sở và thử truy cập các thuộc tính var, _var được định nghĩa trong hàm tạo __init__ của nó?
Hãy cùng tìm hiểu
>>> base = Base[]
>>> base.var
'var'
>>> _0
'var với dấu gạch dưới hàng đầu'
>>> _1
'phương pháp được gọi là'
>>> _2
'phương thức có dấu gạch dưới đứng đầu được gọi là'
Như bạn có thể thấy, dấu gạch dưới đơn hàng đầu trong các thuộc tính _var và _method không ngăn chúng ta “tiếp cận” lớp và truy cập giá trị của biến đó
Tuy nhiên, dấu gạch dưới hàng đầu ảnh hưởng đến cách tên được nhập từ mô-đun. Tất cả các tên bắt đầu bằng dấu gạch dưới sẽ bị bỏ qua khi nhập mô-đun *
Hãy tạo một tệp [mô-đun] my_string_formatter. py với đoạn mã sau
>>> _3
Bây giờ, hãy hình dung điều gì sẽ xảy ra nếu chúng ta gọi các hàm bằng cách nhập ký tự đại diện
>>> _4
'kiểm tra'
>>> _5
TênLỗi. "tên '_to_upper' không được xác định"
Python không nhập tên có dấu gạch dưới ở đầu [trừ khi mô-đun xác định danh sách __all__ ghi đè hành vi này bằng cách thêm __all__ = ['to_lower', '_to_upper']]
Nhân tiện, nên tránh nhập ký tự đại diện vì chúng làm cho không rõ tên nào có trong không gian tên
Dấu gạch dưới đơn. “var_”
Những tên như vậy được sử dụng để tránh xung đột với các từ khóa trong Python theo quy ước. Bạn thường không nên sử dụng chúng. Quy ước này được định nghĩa và giải thích trong PEP 8
>>> _6
Dấu gạch dưới kép của Python
Các mẫu đặt tên mà chúng tôi đã đề cập cho đến nay chỉ nhận được ý nghĩa của chúng từ các quy ước đã được thống nhất. Với các thuộc tính lớp Python [biến và phương thức] bắt đầu bằng dấu gạch dưới kép, mọi thứ sẽ khác một chút
Mangling tên Python
Tiền tố gạch dưới kép khiến trình thông dịch Python viết lại tên thuộc tính để tránh xung đột đặt tên trong các lớp con
Làm thế nào nó hoạt động?
>>> _7
Chúng ta hãy xem các thuộc tính đối tượng với hàm dir[] tích hợp
>>> _8
['_Test__num3', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '
Ở đây chúng tôi đang nhận danh sách các thuộc tính đối tượng. Ở cuối danh sách, chúng tôi có thể nhận thấy các thuộc tính _num2 và num1 của chúng tôi
bản thân. biến num1 xuất hiện nguyên vẹn dưới dạng num1 trong danh sách thuộc tính
bản thân. _num2 hoạt động theo cùng một cách - nó hiển thị là _num2. Như chúng tôi đã nói trước đây, gạch dưới hàng đầu chỉ là một quy ước
Vậy điều gì đã xảy ra với __num3?
Nếu để ý kỹ, bạn sẽ thấy thuộc tính _Test__num3 ở đầu danh sách. Đây là tên xáo trộn mà trình thông dịch Python áp dụng. Nó hoạt động theo cách đó để bảo vệ biến không bị ghi đè trong các lớp con
Xáo trộn tên cũng áp dụng cho tên phương thức [và thành thật mà nói, cho tất cả các tên bắt đầu bằng dấu gạch dưới kép ở đầu trong ngữ cảnh lớp]
>>> _9
Lỗi thuộc tính. "Đối tượng NameManglingMethod không có thuộc tính '__method'"
>>> _ * 30
'phương pháp trộn tên'
Dấu gạch dưới ở đầu và ở cuối kép. "__var__"
Hàm Python bắt đầu bằng dấu gạch dưới
Cái gọi là phương pháp đặc biệt [ma thuật]. Ví dụ: __init__, __len__. Một số trong số chúng thực hiện các tính năng cú pháp, một số lưu trữ dữ liệu đặc biệt. __file__ chỉ đường dẫn của file code, __eq__ được thực thi khi gọi biểu thức a == b
Tất nhiên, người dùng có thể tạo các phương thức của riêng họ
>>> _ * 31
Các biến Python có dấu gạch dưới ở đầu và ở cuối
Các biến được bao quanh bởi một tiền tố gạch dưới kép và hậu tố không bị ảnh hưởng bởi trình thông dịch Python
hạng A
>>> _ * 32
'var'
Tuy nhiên, những tên có cả hai dấu gạch dưới ở đầu và ở cuối được dành riêng cho mục đích sử dụng đặc biệt trong ngôn ngữ. Quy tắc này bao gồm những thứ như __init__ cho hàm tạo đối tượng hoặc __call__ để làm cho đối tượng có thể gọi được, v.v.
Quốc tế hóa và bản địa hóa Python Underscore
Đây chỉ là sự thỏa thuận về tên của các chức năng này, chúng không ảnh hưởng đến cú pháp. Truyền thống này đến từ C và mô-đun gettext tích hợp được sử dụng để bản địa hóa. Nó được sử dụng giống như trong Django, khung web phổ biến nhất
# tài liệu chính thức - https. // tài liệu. con trăn. org/3/library/gettext. html
>>> _ * 33____24
Dấu gạch dưới Python để chia số thành chữ số
Tính năng này khá mới, nó chỉ được thêm vào Python 3. 6. Bây giờ bạn có thể sử dụng dấu gạch dưới để phân tách các số, giúp cải thiện tổng quan về mã