Хотя в большинстве языков программирование (конечно, не во всех) символ подчеркивание ( _ ) используется только для задания имен переменных и функций в стиле snake-case, в Python он имеет особое значение. Если вы хорошо знаете python, синтаксис подобный этому for _ in range(10), __init__ (self), должен быть вам хорошо знаком. Если нет, то этот пост подробно расскажет о том, когда и как используется символ подчеркивание ( _ ) в Python.
Существует 5 особых случаев использования символа подчеркивания.
Давайте рассмотрим подробнее каждый случай.
Интерпретатор python сохраняет последнее значение выражения в специальной переменной, называемой ‘_‘. Эта функция была впервые использована в стандартном интерпретаторе CPython, и теперь присутствует и в других интерпретаторах Python.
>>> 10 10 >>> _ 10 >>> _ * 3 30 >>> _ * 20 600
Подчеркивание также используется для игнорирования не нужных значений. Если вам не нужны значения или значения не используются в коде, просто присвойте значение символу подчеркивания.
# Игнорирование значение при распаковке x, _, y = (1, 2, 3) # x = 1, y = 3 # Игнорирование несколько значений. # Это называется «Расширенная распаковка», # которая доступна только в Python 3.x x, *_, y = (1, 2, 3, 4, 5) # x = 1, y = 5 # Игнорирование индекса for _ in range(10): do_something() # Игнорировать значение определенного местоположения for _, val in list_of_tuple: do_something()
Подчеркивание наиболее часто используется в «наименовании» методов, функции и переменных. В PEP8, который является руководящим сборником всех соглашений в Python, описано следующие 4 случая использование подчеркивания в именовании.
_single_leading_underscore
Один символ подчеркивания в начале имени. Это соглашение используется для объявления приватных переменных, функций, методов и классов в модуле. Все, что именовано согласно этому соглашению игнорируется в импорте по команде from module import *. Однако, нужно помнить что конечно же, Python не поддерживает по-настоящему приватный доступ, поэтому мы не можем принудительно установить что-то частное, а всегда все можем вызывать напрямую.
_internal_name = 'one_nodule' # приватная переменная _internal_version = '1.0' # приватная переменная class _Base: # private class _hidden_factor = 2 # приватная переменная def __init__(self, price): self._price = price def _double_price(self): # приватная метод return self._price * self._hidden_factor def get_double_price(self): return self._double_price()
single_trailing_underscore_
Один символ подчеркивания в конце имени. Это соглашение может использоваться для предотвращения конфликта с встроенными именами переменных и функций в Python.
Tkinter.Toplevel(master, class_='ClassName') # Предотвращаем конфликт с ключевым словом 'class' list_ = List.objects.get(1) # Предотвращаем конфликт с ключевым словом 'list'
__double_leading_underscore
Двойной символ подчеркивания в начале имени. Это скорее вопрос синтаксиса, чем соглашения. Двойное подчеркивание меняет имена атрибутов класса, чтобы избежать конфликтов имен атрибутов между классами. (так называемое «изменение» означает, что компилятор или интерпретатор изменяет имена переменных или функций с помощью некоторых правил, а не используют их как есть)
Правило изменения в Python заключается в добавлении к имени класса «ClassName» имени атрибута, объявленных с двойным подчеркиванием. То есть, если вы напишите метод с именем «__method» в классе, имя будет изменено на «_ClassName__method». См пример ниже.
class A: def _single_method(self): pass def __double_method(self): # for mangling pass class B(A): def __double_method(self): # for mangling pass
Поскольку атрибуты, названные c двойным подчеркиванием в начале, будут изменены, как описано выше, мы не можем получить к ним доступ к ним напрямую с помощью «ClassName .__method». Иногда некоторые люди используют это момент как создание настоящих приватных методов, но это создано не для этого и не рекомендуется использовать для создания приватных методов.
Еще один пример:
>>> class MyClass(): ... def __init__(self): ... self.__superprivate = "Hello" ... self._semiprivate = ", world!" ... >>> mc = MyClass() >>> print mc.__superprivate Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: myClass instance has no attribute '__superprivate' >>> print mc._semiprivate , world! >>> print mc.__dict__ {'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}
__double_leading_and_trailing_underscore__
Двойное подчеркивание в начале и в конце имени. Это соглашение используется для создания специальных переменных или методов (так называемый «магические методы»), таких как __init__, __len__. Эти методы предоставляют специальные синтаксические функции или делают специальные вещи (например осуществляют протокол дескриптеров). Например, __file__ указывает местоположение файла Python, __eq__ выполняется, когда выполняется выражение a == b.
Пользователь, конечно, может создать свой собственный специальный метод, но в это очень редко возникает реальная потребность. Обычно может возникнуть необходимость в изменение некоторых встроенных специальных методов. (Например, очень часто вам будет нужно инициализировать свой класс с помощью __init__, который выполняется при создании экземпляра класса.)
class A: def __init__(self, a): # использование специального метода '__init__' self.a = a def __custom__(self): # пользовательский специальный метод. pass
Это просто соглашение, и оно не имеет никаких синтаксических особенностей. Таким образом, подчеркивание не означает что это обязательно функции i18n/l10n, и это просто соглашение, которое связывает библиотеки i18n/l10n с переменной подчеркивания, взятой из соглашения в языке C. Встроенная библиотека gettext, предназначенная для i18n/l10n, использует это соглашение. Так же Django поддерживает i18n/l10n, и то же использует это соглашение.
# официальная документация : https://docs.python.org/3/library/gettext.html import gettext gettext.bindtextdomain('myapplication','/path/to/my/language/directory') gettext.textdomain('myapplication') _ = gettext.gettext # ... print(_('This is a translatable string.'))
Эта функция была добавлена в Python 3.6. Она используется для разделения цифр больших чисел для удобства чтения.
dec_base = 1_000_000
bin_base = 0b_1111_0000
hex_base = 0x_1234_abcd
print(dec_base) # 1000000
print(bin_base) # 240
print(hex_base) # 305441741
В этой статье мы рассмотрели использования символа подчеркивание в Python. Хотя я давно уже программист на Python, я не знал некоторых из них, пока не написал этот пост. Надеюсь что вы как и я, узнали что нибудь новое о использование символа подчеркивании в Python.
Оригинал: Understanding the underscore( _ ) of Python
Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…
Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…
Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…
Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…
Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…
Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…
View Comments
познавательно