Какие еще есть умные имена операторов?
После того, как 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, чтобы защитить себя от нулевых значений и предоставить значения присваивания по умолчанию, когда основной параметр не работает.
Какое ваше любимое использование этих операторов?