Для чего используется символ подчеркивание ( _ ) в Python
Хотя в большинстве языков программирование (конечно, не во всех) символ подчеркивание ( _ ) используется только для задания имен переменных и функций в стиле snake-case, в Python он имеет особое значение. Если вы хорошо знаете python, синтаксис подобный этому for _ in range(10), __init__ (self), должен быть вам хорошо знаком. Если нет, то этот пост подробно расскажет о том, когда и как используется символ подчеркивание ( _ ) в Python.
Существует 5 особых случаев использования символа подчеркивания.
- Для хранения значения последнего выражения в интерпретаторе.
- Для игнорирования значений. (так называемое «I don’t care» — «мне все равно»)
- Для придания особого предназначения методам, функциям и переменным.
- Использовать в качестве функций «Интернационализация (i18n)» или «Локализация (l10n)».
- Для разделения цифр в больших числах.
Давайте рассмотрим подробнее каждый случай.
При использовании в интерпретаторе
Интерпретатор 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, и это просто соглашение, которое связывает библиотеки 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
познавательно