Какие еще есть умные имена операторов?

После того, как Python 3.8 выпустил Walrus Operator, и я начал экспериментировать с ним, я не мог не быть впечатлен творчеством в именовании. Я имею в виду, это действительно похоже на моржа. Поэтому я задал себе вопрос: какие еще существуют умные имена операторов?

Это привело меня к оператору Элвиса, ?:, названному так из-за сходства с его знаменитыми волосами. Хотя я не могу сказать, что это «король» операторов, я нашел его достаточно ценным, чтобы поделиться им.

Что такое оператор Элвис?

Как и у других операторов с разговорным именем, у Элвиса есть техническое или формальное имя. Попадая в класс операторов бинарного присваивания - что означает, что для присваивания используются два операнда - оператор Элвиса является «логическим или» с целью присваивания переменной (или константе).

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

// example is language agnostic
// assume variable 'a' is null
// This would store the default string
my_var = a ?: "a default string"

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

// examples are language agnostic
// ternary example
my_var = a ? a : b
// expanded if/else example
if(a) {
   my_var = a
} else {
   my_var = b
}

Есть ли на моем языке оператор Элвис?

Скорее всего, да; хотя он может не иметь сходства с королем. Специфическая последовательность символов ?: присутствует во многих языках, таких как C, C ++, Kotlin, Groovy и ColdFusion.

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

В Python, JavaScript, Ruby и Perl оператор Элвис не существует; однако оператор ИЛИ (_3 _, _ 4_) действует аналогичным образом. В этих случаях выбор между назначением первого или второго операнда не полностью зависит от того, является ли первый нулевым, а скорее от того, что первый является истинным; или дает истинный результат. Это означает, что пустые строки, пустые массивы / списки и неопределенные ключи в объектах / словарях оцениваются как ложные и приводят к назначению второго операнда.

Пример JavaScript:

let name = "";
let user = name || "Default Name"; # Default Name

Пример Python:

person = {
   "first_name": "Jonathan",
   "last_name": "Hsu"
}
middle_initial = person['middle_name'][0] or None # None

Зачем мне использовать оператора Элвиса?

Основная причина использования оператора Элвиса - консолидировать заявления для ясности. Эта консолидация является не только визуальной, но в случае, если a в нашем примере выше является длинной функцией, оператор Элвиса также может влиять на производительность.

Я обнаружил, что основной причиной использования оператора Элвиса является защита от нулевых или неопределенных значений; следовательно, я склоняюсь к его идентичности как к нулевой безопасности. Для меня это чаще всего проявляется при работе со сценариями командной строки Python, которые принимают аргументы.

import argparse
parser = argparse.ArgumentParser(description='')
parser.add_argument('--server', dest='server', help='iFormBuilder server name (ie. app.iformbuilder.com)')
args = parser.parse_args()
server = args.server or ""

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

Зачем мне нужно значение по умолчанию для аргумента? Две причины:

Во-первых, часто последующие функции ожидают определенного типа данных, например строки. Вместо того, чтобы передавать неопределенное или нулевое значение, я могу использовать этот метод для присвоения пустой строки.

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

import argparse
parser = argparse.ArgumentParser(description='')
parser.add_argument('--server', dest='server', help='iFormBuilder server name (ie. app.iformbuilder.com)')
args = parser.parse_args()
server = args.server or "default.iformbuilder.com"

Заключение

Вы можете использовать в своем коде оператор Elvis / null-safety / short-circuititing OR, чтобы защитить себя от нулевых значений и предоставить значения присваивания по умолчанию, когда основной параметр не работает.

Какое ваше любимое использование этих операторов?