Подчёркиванию (_) в Python отводится особенное место. Если в большинстве других языков оно используется в названиях переменных и функций, то в Python подчёркивание (_) обладает гораздо большей властью.
Например, если вы программировали на Python, то вам должен быть знаком следующий синтаксис: for _ in range(10) или init(self).
В этой статье мы рассмотрим 5 способов использования (_) в Python:
- Хранение значения последнего выражения в интерпретаторе.
- Игнорирование некоторых значений.
- Задание специальных значений переменным или функциям.
- Использование функций «Internationalization(i18n)» и «Localization(l10n)».
- Отделение цифр числа друг от друга.
Пройдёмся по каждому случаю отдельно.
Хранение значения последнего выражения в интерпретаторе
Интерпретатор Python хранит значение последнего выражения в специальной переменной «_». Эта возможность сначала использовалась в стандартном CPython-интерпретаторе, но теперь она доступна и в других интерпретаторах.
>>> 10
10
>>> _
10
>>> _ * 3
30
>>> _ * 20
600
Игнорирование некоторых значений
Подчёркивание (_) также используется для игнорирования ненужных вам значений.
# Ignore a value when unpacking
x, _, y = (1, 2, 3) # x = 1, y = 3
# Ignore the multiple values. It is called "Extended Unpacking" which is available in only Python 3.x
x, *_, y = (1, 2, 3, 4, 5) # x = 1, y = 5
# Ignore the index
for _ in range(10):
do_something()
# Ignore a value of specific location
for _, val in list_of_tuple:
do_something()
Задание специальных значений для имён переменных или функций
PEP8, руководство по написанию кода на Python, выделяет 4 способа задания имён.
_single_leading_underscore
Таким способом задаются частные переменные, функции, методы и классы в модуле. Все, что использует такой способ задания имени, будет проигнорировано в from module import *.
_internal_name = 'one_nodule' # private variable
_internal_version = '1.0' # private variable
class _Base: # private class
_hidden_factor = 2 # private variable
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()
single_trailing_underscore_
Такой метод задания имён используется для исключения конфликтов со встроенными именами или классами.
Tkinter.Toplevel(master, class_='ClassName') # Avoid conflict with 'class' keyword
list_ = List.objects.get(1) # Avoid conflict with 'list' built-in type
__double_leading_underscore
Двойное подчёркивание () используется для искажения имён атрибутов в классе. Если мы создадим метод с именем «method» в классе с именем «ClassName», то вызвать этот метод так: «ClassName.__method» — у нас уже не получится. Для дополнительной информации вы можете прочитать о способах задания имён в Python.
class A:
def _single_method(self):
pass
def __double_method(self): # for mangling
pass
class B(A):
def __double_method(self): # for mangling
pass
__double_leading_and_trailing_underscore__
Такой способ именования используется для специальных переменных или функций, таких как init или len.
class A:
def __init__(self, a): # use special method '__init__' for initializing
self.a = a
def __custom__(self): # custom special method. you might almost do not use it
pass
Использование функций «Internationalization(i18n)» и «Localization(l10n)»
# see official docs : [[https://docs.python.org/3/library/gettext.html](https://docs.python.org/3/library/gettext.html)]([https://docs.python.org/3/library/gettext.html](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