Является ли Python чувствительным к регистру?

При изучении нового языка программирования одним из основных моментов является его чувствительность к регистру. Python не является исключением: он регистрозависим, и это следует учитывать.

Да, язык Python чувствителен к регистру

Прежде всего, давайте уточним, что такое чувствительность к регистру. Это различение строчных и прописных букв. Это может быть особенностью не только языка программирования, но и любой компьютерной программы.

Самый короткий ответ на вопрос о чувствительности к регистру в Python — да. Это язык, чувствительный к регистру, как и многие другие популярные языки программирования, такие как Java, C++ и JavaScript. Чувствительность к регистру в Python увеличивает количество идентификаторов или символов, которые можно использовать.

В этой статье мы рассмотрим различные аспекты использования Python в качестве языка, чувствительного к регистру.

Имена в Python с учетом регистра

Наиболее распространенным примером чувствительности к регистру в Python являются имена переменныхusername,  UserName и userName являются тремя разными переменными, и использование одного варианта вместо другого приведет к ошибке. То же правило распространяется и на имена функций.

>>> user_name = 'User1'
>>> print(User_name)

Приведенный выше код вызывает ошибку из-за несоответствия заглавных и строчных букв в именах переменных:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'User_name' is not defined

Правильное использование имен переменных с учетом регистра:

>>> user_name = 'User2'
>>> print(user_name)
User2

Чтобы избежать проблем с чувствительными к регистру именами функций и переменных, используйте имена в нижнем регистре с подчеркиванием между словами для удобочитаемости (например,  user_name), как указано в официальной документации Python.

Имена констант в Python являются исключением из этих соглашений об именовании. Они часто пишутся в верхнем регистре, чтобы можно было легко отличить константу от переменной.

С классами дело обстоит иначе — их имена обычно пишутся в регистре Pascal, то есть каждое слово начинается с заглавной буквы. В именах классов не должно быть подчеркиваний: например,  AppFactory.

Язык Python был разработан как хорошо читаемый, и важно поддерживать его в таком состоянии. Чтобы избежать путаницы в коде, последовательно придерживайтесь соглашения об именах и избегайте имен, которые трудно отличить друг от друга (например, заглавная буква ‘I‘ и строчная ‘l‘). Используйте описательные имена, но при этом делайте их как можно более короткими.

Регистр ключевых слов Python

Ключевые слова — это еще одна важная часть синтаксиса Python. Они тоже регистрозависимы. Напомним, что ключевые слова в Python — это специальные слова, которые имеют определенное значение для интерпретатора. Их использование ограничено; их нельзя использовать в качестве имен переменных или функций.

for i in range(1, 10):
    if i == 5:
        continue
    print(i)

Как видно из приведенного примера кода, большинство ключевых слов Python пишутся в нижнем (строчном) регистре. К распространенным ключевым словам относятся, среди прочих, defimportisnotreturn, и with.

Есть и исключения, но их всего три. Это True,  False и None.

Даже самые незначительные изменения регистра в ключевых словах Python приводят к ошибке:

>>> For i in range(1, 10):
  File "<stdin>", line 1
    For i in range(1, 10):
        ^
SyntaxError: invalid syntax

Можно ли сделать Python нечувствительным к регистру?

Бывают случаи, когда проще было бы не учитывать регистр строк. Представьте себе ситуацию, когда покупатели ищут определенный товар в интернет-магазине. Допустим, они интересуются финским дизайном и ищут вазу Алвара Аалто. Что они набирают в строке поиска? Возможно: «ваза Алвара Аалто», но, скорее всего, «ваза алвара аалто». В любом случае они должны получить одни и те же результаты поиска.

В Python при сравнении строк нам необходимо учитывать чувствительность к регистру. Но не волнуйтесь!  Python имеет полезные встроенные методы, облегчающие жизнь программиста. Есть они и для сравнений без учета регистра.

Подход № 1: строковый метод lower()

Это наиболее популярный подход к сравнению строк без учета регистра в Python. Метод lower() преобразует все символы в строке в нижний регистр, что облегчает сравнение двух строк. В примере показано, как это работает:

english_eels = 'My Hovercraft Is Full of Eels'
other_english_eels = 'My HoVeRcRaFt Is FuLl Of EeLs'
 
if english_eels.lower() == other_english_eels.lower():
    print('Identical strings:')
    print('1.', english_eels.lower())
    print('2.', other_english_eels.lower())
else:
    print('Strings not identical')

Вывод:

Identical strings:
1. my hovercraft is full of eels
2. my hovercraft is full of eels

Подход № 2: строковый метод upper()

Этот метод используется так же, как и lower(), но меняет все символы в строке на заглавные. Посмотрите на пример кода:

polish_eels = 'Mój poduszkowiec jest pełen węgorzy'
other_polish_eels = 'MóJ pOdUsZkOwIeC jEsT pEłEn WęGoRzY'
if polish_eels.upper() == other_polish_eels.upper():
    print('Identical strings:')
    print('1.', polish_eels.upper())
    print('2.', other_polish_eels.upper())
else:
    print('Strings not identical')

Вывод:

Identical strings:
1. MÓJ PODUSZKOWIEC JEST PEŁEN WĘGORZY
2. MÓJ PODUSZKOWIEC JEST PEŁEN WĘGORZY

Подход № 3: строковый метод casefold()

Использование метода casefold() является самым сильным и агрессивным подходом к свертыванию регистров в Python. Он похож на lower(), но в нем удаляются все различия регистра в строках. Это более эффективный способ сравнения без учета регистра в Python.

german_eels = 'Mein Luftkißenfahrzeug ist voller Aale'
other_german_eels = 'MeIn LuFtKißEnFaHrZeUg IsT vOlLeR AaLe'
if german_eels.casefold () == other_german_eels.casefold ():
    print('Identical strings:')
    print('1.', german_eels.casefold())
    print('2.', other_german_eels.casefold())
else:
    print('Strings not identical')

Вывод:

Identical strings:
1. mein luftkissenfahrzeug ist voller aale
2. mein luftkissenfahrzeug ist voller aale

Как видно из кода примера, метод casefold() не только изменил все символы на строчные, но и изменил строчную букву ‘ß‘ на ‘ss‘.

Итоги

Теперь вы знакомы с наиболее важными аспектами регистрочувствительности Python. Также вы познакомились с некоторыми хорошими практиками нейминга с учетом регистра и узнали, как игнорировать регистр при сравнении строк.

Перевод статьи «Is Python Case-Sensitive?».