Как я могу близко достичь?: Из C ++ / C # в Python? - PullRequest
9 голосов
/ 25 сентября 2008

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

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

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

Ответы [ 9 ]

23 голосов
/ 25 сентября 2008

В Python 2.5 есть

A if C else B

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

stringValue = otherString or defaultString
5 голосов
/ 25 сентября 2008

@ Dan

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

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

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

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

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

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

C = if cond then A else B

Это выигрывает руки.

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

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

1 голос
/ 21 октября 2009

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

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

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

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

1 голос
/ 25 сентября 2008

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

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

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

0 голосов
/ 01 мая 2009

Глава 4 diveintopython.net содержит ответ. Это называется и-или трюк в Python.

0 голосов
/ 26 сентября 2008

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

finalString = get_override() or defaultString

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

0 голосов
/ 26 сентября 2008

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

stringValue = otherString.blank? ? defaultString : otherString;

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

0 голосов
/ 25 сентября 2008

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

string stringValue = otherString ?? defaultString;

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

0 голосов
/ 25 сентября 2008

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

result = question and firstanswer or secondanswer

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

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