Tôi không phải là người bản ngữ. Xin lỗi vì tiếng Anh của tôi. Làm ơn hãy hiểu.
Các dấu gạch dưới [_] là đặc biệt trong Python.
Mặc dù dấu gạch dưới [_] được sử dụng cho các biến và hàm vỏ rắn trong hầu hết các ngôn ngữ [tất nhiên, không phải cho tất cả], nhưng nó có ý nghĩa đặc biệt trong Python. Nếu bạn là lập trình viên Python, ________ 4 & nbsp ;, __init__[self]
như cú pháp có thể quen thuộc.
Bài đăng này sẽ giải thích về thời điểm và cách sử dụng dấu gạch dưới [_] và giúp bạn hiểu nó.
Có 5 trường hợp để sử dụng dấu gạch dưới trong Python.
- Để lưu trữ giá trị của biểu thức cuối cùng trong phiên dịch.
- Để bỏ qua các giá trị cụ thể. [cái gọi là "tôi không quan tâm"]
- Để đưa ra ý nghĩa và chức năng đặc biệt cho tên của vartiable hoặc chức năng.
- Để sử dụng làm chức năng quốc tế hóa [I18N] hoặc ‘nội địa hóa [L10N].
- Để tách các chữ số của giá trị theo nghĩa đen.
Hãy cùng nhìn vào từng trường hợp.
Khi được sử dụng trong phiên dịch viên
Trình thông dịch Python lưu trữ giá trị biểu thức cuối cùng cho biến đặc biệt có tên là ‘_. Tính năng này đã được sử dụng trong phiên dịch Cpython tiêu chuẩn trước và bạn cũng có thể sử dụng nó trong các phiên dịch viên Python khác.
>>> 1010 >>> _10 >>> _ * 330 >>> _ * 20600
Để bỏ qua & nbsp; giá trị
Các dấu gạch dưới cũng được sử dụng để bỏ qua các giá trị cụ thể. Nếu bạn không cần các giá trị cụ thể hoặc các giá trị không được sử dụng, chỉ cần gán các giá trị cho dấu gạch dưới.
_ # Bỏ qua một giá trị khi giải nén_x, _, y = [1, 2, 3] # x = 1, y = 3
# Bỏ qua nhiều giá trị. Nó được gọi là "Giải nén mở rộng" chỉ có sẵn trong Python 3.xx, *_, y = [1, 2, 3, 4, 5] # x = 1, y = 5
_# Bỏ qua index_for _ trong phạm vi [10]: do_somothing []
# Bỏ qua một giá trị của vị trí cụ thể cho _, val trong list_of_tuple: do_somothing []
Đưa ra ý nghĩa đặc biệt cho tên của các biến và hàm
Các dấu gạch dưới có thể được sử dụng nhiều nhất trong ‘đặt tên. PEP8 là Hướng dẫn Công ước Python giới thiệu 4 trường hợp đặt tên sau đây.
** _ SINGLE_LEADING_UNDERSCORE ** Công ước này được sử dụng để khai báo các biến riêng, chức năng, phương thức và lớp trong một mô -đun. Bất cứ điều gì với quy ước này đều bị bỏ qua trong ____ 6. & nbsp; Tuy nhiên, tất nhiên, Python không hỗ trợ thực sự riêng tư, vì vậy chúng tôi không thể buộc một cái gì đó riêng tư và cũng có thể gọi nó trực tiếp từ các mô -đun khác. Vì vậy, đôi khi chúng tôi nói nó là chỉ báo sử dụng nội bộ yếu.private variables, functions, methods and classes in a module. Anything with this convention are ignored in from module import *
. However, of course, Python does not supports truly
private, so we can not force somethings private ones and also can call it directly from other modules. So sometimes we say it “weak internal use indicator”.
_iNternal_name = 'One_Nodule' # private Biến_Internal_version = '1.0' # Biến riêng tư
Lớp _Base: # private class_hidden_factor = 2 # Biến riêng tư
def \_\_init\_\_[self, price]:
self.\_price = price
def \_double\_price[self]: # private method
return self.\_price \* self.\_hidden\_factor
def get\_double\_price[self]:
return self.\_double\_price[]
** Đơn_trailing_underscore _ ** Công ước này có thể được sử dụng để tránh xung đột với các từ khóa hoặc từ khóa Python. Bạn có thể không sử dụng nó thường xuyên.
Tkinter.toplevel [chủ, lớp _ = 'className'] # Tránh xung đột với từ khóa 'lớp'
list_ = list.objects.get [1] # Tránh xung đột với loại 'Danh sách' tích hợp
** __ double_leading_underscore ** Đây là về cú pháp chứ không phải là một quy ước. Double nhấn mạnh sẽ xử lý các tên thuộc tính của một lớp để tránh xung đột tên thuộc tính giữa các lớp. . Với Double UnderCore. & NBSP; nghĩa là, nếu bạn viết phương thức có tên là __method, trong một lớp, tên sẽ bị xáo trộn trong mẫu _ classname__Method.
Lớp A: Def _Single_Method [self]: Pass
def \_\_double\_method[self]: # for mangling
pass
Lớp B [a]: def __double_method [self]: # cho ManglingPass
Do các thuộc tính được đặt tên với Double Undercore sẽ bị xáo trộn như trên, chúng ta không thể truy cập nó bằng phương thức ClassMame .__ Phương thức. Đôi khi, một số người sử dụng nó như những người thực sự sử dụng các tính năng này, nhưng nó không dành cho riêng tư và không được khuyến nghị cho điều đó. Để biết thêm chi tiết, đọc đặt tên Python.
** __ double_lead_and_trailing_underscore __ ** Công ước này được sử dụng cho các biến hoặc phương thức đặc biệt [được gọi là Phương pháp ma thuật Hồi giáo] như ____, __len__
. Các phương pháp này cung cấp các tính năng cú pháp đặc biệt hoặc làm những điều đặc biệt. Ví dụ: __file__
chỉ ra vị trí của tệp Python,
def \_\_double\_method[self]: # for mangling
pass
0 được thực thi khi biểu thức def \_\_double\_method[self]: # for mangling
pass
1 bị loại bỏ. & NBSP; Một người dùng tất nhiên có thể tạo phương thức đặc biệt tùy chỉnh, đó là trường hợp rất hiếm, nhưng thường có thể sửa đổi một số phương thức đặc biệt tích hợp. [ví dụ: bạn nên khởi tạo lớp với __init__
sẽ được thực thi lúc đầu khi một thể hiện của lớp được tạo.]Lớp A: def __init __ [self, a]: # sử dụng phương pháp đặc biệt '__init__' để khởi tạo
def \_\_custom\_\_[self]: # custom special method. you might almost do not use it
pass
Khi các chức năng quốc tế hóa [I18N]/Nội địa hóa [L10N]
Đó chỉ là quy ước, không có bất kỳ chức năng cú pháp nào. Nghĩa là, dấu gạch dưới không có nghĩa là i18n/l10n, và nó chỉ là một quy ước liên kết biến i18n/l10n với dấu gạch dưới đã được từ Django là Python Web Framework hỗ trợ I18N/L10N cũng giới thiệu và sử dụng quy ước này.i18n/l10n, and it is just a convention that binds the i18n/l10n to underscore variable has been from C convention.The built-in library
def \_\_double\_method[self]: # for mangling
pass
3 which is for i18n/l10n uses this
convention, and Django which is Python web framework supports i18n/l10n also introduces and uses this convention.# Xem tài liệu chính thức: //docs.python.org/3/l Library/gettext.htmlimport getText
gettext.bindtextdomain ['myApplication', '/path/to/my/ngôn ngữ/thư mục']
# ...
print[_['This is a translatable string.']]
Để phân tách các chữ số của số theo nghĩa đen & nbsp;
Tính năng này đã được thêm vào Python 3.6. Nó được sử dụng để phân tách các chữ số của các số bằng cách sử dụng dấu gạch dưới cho khả năng đọc.
Dec_base = 1_000_000BIN_BASE = 0B_1111_0000HEX_BASE = 0X_1234_ABCD
in [dec_base] # 1000000print [bin_base] # 240print [hex_base] # 305441741
Sự kết luận
Cho đến nay, chúng tôi đã bao gồm dấu gạch dưới của Python. Trong khi tôi là một lập trình viên Python, tôi đã không biết một số trong số họ cho đến khi viết bài này. Đặc biệt, i18n/l10n rất mới đối với tôi. Giống như tôi, tôi hy vọng bạn có được một số kiến thức hữu ích về việc nhấn mạnh từ bài đăng này.i18n/l10n is very new to me.Like me, I hope you gain some useful knowledges about underscore from this post.
Tiếp theo, tôi sẽ bao gồm những điều thú vị hơn về Python. Cảm ơn bạn.
_UPDATE_ADDED Tính năng mới [PEP 515] đã được thêm vào trong Python 3.6Added the new feature [PEP 515] was added in Python 3.6
Hacker Noon là cách tin tặc bắt đầu buổi chiều của họ. Chúng tôi là một phần của @Amif Family. Chúng tôi hiện đang chấp nhận đệ trình và vui lòng thảo luận về các cơ hội quảng cáo và tài trợ.
Để tìm hiểu thêm, hãy đọc trang Giới thiệu của chúng tôi, như/nhắn tin cho chúng tôi trên Facebook hoặc đơn giản là tweet/dm @hackernoon.
Nếu bạn thích câu chuyện này, chúng tôi khuyên bạn nên đọc những câu chuyện công nghệ mới nhất và những câu chuyện công nghệ xu hướng của chúng tôi. Cho đến lần tiếp theo, don lồng coi thực tế của thế giới là điều hiển nhiên!
ĐANG TẢI. . . Nhận xét và nhiều hơn nữa!
. . . comments & more!