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

Spread the love
  • 1
    Share

Хотя в большинстве языков программирование (конечно, не во всех) символ подчеркивание ( _ ) используется только для задания имен переменных и функций в стиле 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


Spread the love
  • 1
    Share

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *