«еще» считается вредным в Python? - PullRequest
11 голосов
/ 15 мая 2009

В ответе ( S.Lott) на вопрос о try...else утверждении Python:

На самом деле, даже в операторе if иначе: может быть оскорблен по-настоящему ужасно способы создания ошибок, которые очень трудно найти. [...]

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

Это широко распространенное мнение? else считается вредным ?

Конечно, вы можете написать с ним запутанный код, но это верно для любой другой языковой конструкции. Даже Python for...else кажется мне очень удобным (меньше для try...else).

Ответы [ 13 ]

1 голос
/ 15 мая 2009

Мне кажется, что для любого языка и любого оператора управления потоком, где есть сценарий по умолчанию или побочный эффект, этот сценарий должен иметь одинаковый уровень рассмотрения. Логика if или switch или while хороша только для условий if (x) while (x) или for (...). Поэтому утверждение не вредно, но логика в их состоянии.

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

Тогда я не считаю, что 'else' более опасен, чем отключение в цикле for () или плохое управление памятью. Это все об алгоритмах. Если ваши автоматы полны по своим масштабам и возможным ответвлениям, и все они конкретны и понятны, опасности нет. Опасность заключается в неправильном использовании логики, лежащей в основе выражений, людьми, не осознающими влияния логики широкого спектра. Компьютеры глупы, они делают то, что им говорит их оператор (в теории)

Я считаю try и catch опасными, поскольку они могут свести на нет обработку неизвестного количества кода. Ветвление выше повышения может содержать ошибку, выделенную самим повышением . Это может быть неочевидным. Это похоже на превращение последовательного набора инструкций в дерево или график обработки ошибок, где каждый компонент зависит от ветвей в родительском элементе. Странный. Имейте в виду, я люблю C.

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

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

Рассмотрим:

try:
    file = open('somefile','r')
except IOError:
    logger.error("File not found!")
else:
    # Some file operations
    file.close()
# Some code that no longer explicitly references 'file'

Было бы очень приятно сказать, что приведенный выше блок препятствовал тому, чтобы код пытался получить доступ к файлу, который не существует, или каталогу, для которого у пользователя нет разрешений, и чтобы сказать, что все инкапсулировано, потому что оно находится внутри try...except...else блок. Но на самом деле большая часть кода в приведенной выше форме действительно должна выглядеть так:

try:
    file = open('somefile','r')
except IOError:
    logger.error("File not found!")
    return False
# Some file operations
file.close()
# Some code that no longer explicitly references 'file'

Вы часто дурачите себя, говоря, что, поскольку на file больше нет ссылок в области видимости, можно продолжать кодирование после блока, но во многих случаях что-то происходит, когда это просто не в порядке. Или, возможно, позже будет создана переменная в блоке else, который не создан в блоке except.

Так я бы отличил if...else от try...except...else. В обоих случаях нужно сделать блоки параллельными в большинстве случаев (переменные и набор состояний в одном должны быть установлены в другом), но в последнем случае кодеры часто этого не делают, скорее всего потому, что это невозможно или не имеет значения. В таких случаях часто гораздо важнее возвращаться к вызывающему абоненту, чем пытаться продолжать работать над тем, что, по вашему мнению, будет в лучшем случае.

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

В приведенном примере трудно рассуждать, это может быть написано явно, но все еще необходимо. Например.

if a < 10:       
    # condition stated explicitly   
elif a > 10 and b < 10:       
    # condition confusing but at least explicit   
else:       
    # Exactly what is true here?       
    # Can be hard to reason out what condition is true

Может быть написано

if a < 10:       
    # condition stated explicitly   
elif a > 10 and b < 10:       
    # condition confusing but at least explicit   
elif a > 10 and b >=10:
    # else condition
else:   
    # Handle edge case with error?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...