Python

Для чего используется символ подчеркивание ( _ ) в Python

Spread the love

Хотя в большинстве языков программирование (конечно, не во всех) символ подчеркивание ( _ ) используется только для задания имен переменных и функций в стиле snake-case, в Python он имеет особое значение. Если вы хорошо знаете python, синтаксис подобный этому for _ in range(10), __init__ (self), должен быть вам хорошо знаком. Если нет, то этот пост подробно расскажет о том, когда и как используется символ подчеркивание ( _ ) в Python.

Существует 5 особых случаев использования символа подчеркивания.

  1. Для хранения значения последнего выражения в интерпретаторе.
  2. Для игнорирования значений. (так называемое «I don’t care» — «мне все равно»)
  3. Для придания особого предназначения методам, функциям и переменным.
  4. Использовать в качестве функций «Интернационализация (i18n)» или «Локализация (l10n)».
  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, и это просто соглашение, которое связывает библиотеки 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

Была ли вам полезна эта статья?
[12 / 4.8]

Spread the love
Editorial Team

View Comments

Recent Posts

Vue 3.4 Новая механика v-model компонента

Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование​ v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…

12 месяцев ago

Анонс Vue 3.4

Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…

12 месяцев ago

Как принудительно пере-отобразить (re-render) компонент Vue

Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…

2 года ago

Проблемы с установкой сертификата на nginix

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…

2 года ago

Введение в JavaScript Temporal API

Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…

2 года ago

Когда и как выбирать между медиа запросами и контейнерными запросами

Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…

2 года ago