Как я могу достичь близкого результата?:из C++/C# в Python?

StackOverflow https://stackoverflow.com/questions/135303

Вопрос

На C# я мог бы легко написать следующее:

string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;

Есть ли быстрый способ сделать то же самое в Python, или я застрял в операторе «if»?

Это было полезно?

Решение

В Python 2.5 есть

A if C else B

который ведет себя очень похоже на ?:в С.Однако это не одобряется по двум причинам:читабельность и тот факт, что обычно существует более простой способ решения проблемы.Например, в вашем случае:

stringValue = otherString or defaultString

Другие советы

@Дэн

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

Этот тип кода длиннее и выразительнее, но и более читабелен.

Ну да, это длиннее.Не уверен насчет «более выразительного» и «более читабельного».По крайней мере, ваше утверждение спорно.Я бы даже сказал, что это совершенно неправильно по двум причинам.

Во-первых, ваш код делает упор на принятие решений (довольно сильно).С другой стороны, условный оператор подчеркивает нечто другое, а именно значение (соответственно.присвоение указанного значения).А это точно чего хочет автор этого кода.Принятие решений на самом деле является скорее побочным продуктом кода.Важная часть здесь — операция присваивания.Ваш код скрывает это присвоение за большим количеством синтаксического шума:ветвление.

Ваш код менее выразителен, потому что он смещает акцент с важной части.

Даже тогда ваш код, вероятно, превзойдет какое-нибудь непонятное искусство ASCII, например ?:.Встроенный-if было бы предпочтительнее.Лично мне не нравится вариант, представленный в Python 2.5, потому что он обратный.Я бы предпочел что-то, что читается в том же потоке (направлении), что и тернарный оператор C, но использует слова вместо символов ASCII:

C = if cond then A else B

Это безоговорочно выигрывает.

К сожалению, C и C# не имеют такого выразительного выражения.Но (и это второй аргумент), тернарный условный оператор языков C настолько давно устоялся, что сам по себе стал идиомой.Тернарный оператор — такая же часть языка, как и «обычный» оператор. if заявление.Поскольку это идиома, любой, кто знает язык, сразу же правильно прочтет этот код.Более того, это чрезвычайно короткий и лаконичный способ выразить эту семантику.На самом деле это самый короткий путь, который только можно себе представить.Он чрезвычайно выразителен, поскольку не затеняет суть лишним шумом.

Наконец, Джефф Этвуд написал прекрасное заключение по этому поводу: Лучший код — это отсутствие кода вообще.

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

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

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

Есть несколько дубликатов этого вопроса, например.

По сути, в общих настройках код до версии 2.5 должен использовать это:

 (condExp and [thenExp] or [elseExp])[0]

(учитывая, что condExp, thenExp и elseExp являются произвольными выражениями), поскольку это позволяет избежать неправильных результатов, если thenExp оценивается как логическое значение False, сохраняя при этом короткую оценку.

Кстати, j0rd4n, ты нет(пожалуйста не надо!) напишите такой код на C#.Помимо того, что IsDefaultOrNull на самом деле называется IsNullOrEmpty, это чистое раздувание кода.C# предлагает оператор объединения для таких ситуаций:

string stringValue = otherString ?? defaultString;

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

Я также обнаружил, что достаточно просто использовать оператор «или».Например:

finalString = get_override() or defaultString

Если get_override() возвращает "" или None, он всегда будет использовать defaultString.

Глава 4 сайта divintopython.net есть ответ.В Python это называется трюком «и-или».

Вы можете воспользоваться тем фактом, что логические выражения возвращают свое значение, а не только статус true или false.Например, вы всегда можете использовать:

result = question and firstanswer or secondanswer

С оговоркой, что он не работает так же, как тернарный оператор, если первый ответ имеет значение false.Это связано с тем, что сначала оценивается вопрос, предполагая, что он истинен, и возвращается первый ответ, если только первый ответ не является ложным, поэтому это использование не действует как тернарный оператор.Однако если вы знаете значения, обычно проблем не возникает.Примером может быть:

result = choice == 7 and "Seven" or "Another Choice"

Если бы вы использовали Ruby, вы могли бы написать

stringValue = otherString.blank? ? defaultString : otherString;

встроенный blank? метод означает значение null или пустой.
Переходи на темную сторону...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top