Мои плохие, документы объяснили проблему, я просто не знал, что искал
, если URL запроса не соответствует ни одному из шаблонов в URLconf, и он не заканчивается косой чертой, перенаправление HTTP отправляется на тот же URL с добавленной косой чертой.
BLOCKQUOTE>
Это ' Безопасно зависеть от порядка условных выражений (здесь ссылка на Python здесь ), особенно из-за проблемы, на которую вы указали - очень полезно иметь возможность оценки короткого замыкания, которая может вызвать проблемы в цепочке условных выражений .
Этот код появляется на большинстве языков:
IF exists(variable) AND variable.doSomething()
THEN ...
Да, это безопасно, это явно и очень четко определено в ссылке на язык:
Выражение
x и y
сначала оцениваютх
; еслиx
равноfalse
, его значение равно вернулся; в противном случаеy
оценивается и полученное в результате значение возвращается.Сначала вычисляется выражение
x или y
.х
; еслиx
равно true, его значение вернулся; в противном случаеy
оценивается и полученное значение возвращается.
Это совершенно безопасно, и я делаю это все время.
Я бы пошел с попыткой / исключением, но это зависит от того, что вы знаете о переменной.
Если вы ожидаете, что переменная будет существовать большую часть времени, тогда попытка / исключение - это меньше операций. Если вы ожидаете, что переменная в большинстве случаев будет None, тогда оператор IF будет меньше операций.
Все не так просто. Как чувак 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 # (и других) должны быть очень осторожны при кодировании на других языках.
Если вы ищете способ абстрагироваться от свойств используемой файловой системы (разделители путей и т. Д.), И если вас устраивает решение, предназначенное только для 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."
Да, я знаю, что это нереалистичный пример, но в реальном коде случаются вариации, особенно когда Нет
используется для указания аргумента функции по умолчанию .