Действительно ли безопасно положиться при условии порядок оценки в если операторы?

Мои плохие, документы объяснили проблему, я просто не знал, что искал

, если URL запроса не соответствует ни одному из шаблонов в URLconf, и он не заканчивается косой чертой, перенаправление HTTP отправляется на тот же URL с добавленной косой чертой.

BLOCKQUOTE>

66
задан tgray 15 April 2009 в 15:57
поделиться

6 ответов

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

Этот код появляется на большинстве языков:

IF exists(variable) AND variable.doSomething()
    THEN ...
84
ответ дан Dan Lew 24 November 2019 в 15:00
поделиться

Да, это безопасно, это явно и очень четко определено в ссылке на язык:

Выражение x и y сначала оценивают х ; если x равно false , его значение равно вернулся; в противном случае y оценивается и полученное в результате значение возвращается.

Сначала вычисляется выражение x или y . х ; если x равно true, его значение вернулся; в противном случае y оценивается и полученное значение возвращается.

32
ответ дан vartec 24 November 2019 в 15:00
поделиться

Это совершенно безопасно, и я делаю это все время.

1
ответ дан FogleBird 24 November 2019 в 15:00
поделиться

Я бы пошел с попыткой / исключением, но это зависит от того, что вы знаете о переменной.

Если вы ожидаете, что переменная будет существовать большую часть времени, тогда попытка / исключение - это меньше операций. Если вы ожидаете, что переменная в большинстве случаев будет None, тогда оператор IF будет меньше операций.

1
ответ дан Jason Coon 24 November 2019 в 15:00
поделиться

Все не так просто. Как чувак C #, я очень привык делать что-то вроде:

if(x != null && ! string.isnullorempty(x.Name))
{
   //do something
}

Вышеупомянутое отлично работает и оценивается как ожидалось. Однако в VB.Net следующее приведет к результату, которого вы НЕ ожидали:

If Not x Is Nothing **And** Not String.IsNullOrEmpty(x.Name) Then

   'do something

End If

Вышеуказанное вызовет исключение. Правильный синтаксис должен быть

If Not x Is Nothing **AndAlso** Not String.IsNullOrEmpty(x.Name) Then

   'do something

End If

. Обратите внимание на очень тонкую разницу. Это сбило меня с толку примерно на 10 минут (слишком долго), и именно поэтому ребята из C # (и других) должны быть очень осторожны при кодировании на других языках.

1
ответ дан 24 November 2019 в 15:00
поделиться

Если вы ищете способ абстрагироваться от свойств используемой файловой системы (разделители путей и т. Д.), И если вас устраивает решение, предназначенное только для C ++ , взгляните на Boost.Filesystem .

Пути могут быть указаны в переносимом универсальном формате пути (в основном в формате POSIX) и автоматически преобразуются в собственный формат:

path my_path( "some_dir/file.txt" );

Элементы могут быть объединены в путь с помощью оператора / , а затем результат может быть напрямую использован для открытия файла:

ifstream file1( my_path / "foo/bar" );

Более того, эта функция является частью Технического отчета 2, то есть скорее всего, попадет в стандартную библиотеку.

безопасно, пока вы откровенны. Если вы не уверены, то рассмотрите этот очень надуманный класс:

class Contrived(object):
    def __contains__(self, s):
        return True
    def __nonzero__(self):
        return False

my_var = Contrived()
if 'something' in my_var:
    print "Yes the condition is true"
if my_var and 'something' in my_var:
    print "But this statement won't get reached."
if my_var is not None and 'something' in my_var:
    print "Whereas this one will."

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

2
ответ дан 24 November 2019 в 15:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: