Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя
Технарь, эникейщик, CRM, DevOps, сети, железо...  · 29 окт 2021

Python: 5 способов использования подчёркивания (_)

Подчёркиванию (_) в 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
Разработка+4