1) Так называемая проблема «Mutable Default Argument» - это, в общем, специальный пример, демонстрирующий, что: «Все функции с этой проблемой также страдают от аналогичной проблемы побочного эффекта от фактического параметра». Это противоречит правилам
Пример:
def foo(a=[]): # the same problematic function
a.append(5)
return a
>>> somevar = [1, 2] # an example without a default parameter
>>> foo(somevar)
[1, 2, 5]
>>> somevar
[1, 2, 5] # usually expected [1, 2]
Решение: копия Совершенно безопасным решением является copy
или deepcopy
входной сигнал сначала, а затем делать все с копией.
def foo(a=[]):
a = a[:] # a copy
a.append(5)
return a # or everything safe by one line: "return a + [5]"
Многие встроенные изменяемые типы имеют метод копирования, такой как some_dict.copy()
или some_set.copy()
, или могут быть скопированы легко, как somelist[:]
или list(some_list)
, Каждый объект также может быть скопирован с помощью copy.copy(any_object)
или более тщательным с помощью copy.deepcopy()
(последний полезен, если изменяемый объект состоит из изменяемых объектов). Некоторые объекты основаны на побочных эффектах, таких как «файл», и не могут быть осмысленно воспроизведены копией. копирование
Пример проблемы для аналогичного вопроса SO
class Test(object): # the original problematic class
def __init__(self, var1=[]):
self._var1 = var1
somevar = [1, 2] # an example without a default parameter
t1 = Test(somevar)
t2 = Test(somevar)
t1._var1.append([1])
print somevar # [1, 2, [1]] but usually expected [1, 2]
print t2._var1 # [1, 2, [1]] but usually expected [1, 2]
Он не должен быть ни сохранен ни в одном ] public экземпляра, возвращаемого этой функцией. (Предполагая, что атрибуты private экземпляра не должны быть изменены извне этого класса или подкласса по соглашению, т. Е. _var1
является частным атрибутом)
Заключение: Параметры входных параметров shouldn 'изменяются на месте (мутированные), и они не должны быть привязаны к объекту, возвращаемому функцией. (Если мы предпочитаем программирование без побочных эффектов, которые настоятельно рекомендуются, см. Wiki о «побочном эффекте» (первые два абзаца имеют смысл в этом контексте.).)
2) Только если побочный эффект на фактический параметр требуется, но нежелателен по параметру по умолчанию, тогда полезным решением является def ...(var1=None):
if var1 is None:
var1 = []
Подробнее ..
3) В некоторых случаях используется изменчивое поведение параметров по умолчанию .
Сканировать исходные файлы, чтобы найти @
.
В настоящее время оператор управления ошибкой «@» префикс даже отключит отчет об ошибках для критических ошибок, которые прекратят выполнение скрипта. Среди прочего, это означает, что если вы используете «@» для подавления ошибок от определенной функции, и либо она недоступна, либо была опечатана, скрипт будет умирать прямо там без указания относительно причины.
< / BLOCKQUOTE>
Возможно, что-то отключает вывод ошибки. (Я понимаю, что вы пытаетесь сказать, что другие скрипты правильно выводят свои ошибки в журнал ошибок?)
Вы можете начать отладку скрипта, указав, где он выходит из сценария (начните с добавления echo 1; exit;
в первая строка скрипта и проверка того, выводит ли браузер 1
, а затем перемещает эту строку вниз).
Вот еще одна причина, по которой ошибки могут быть не видны:
У меня была такая же проблема. В моем случае я скопировал источник из производственной среды. Следовательно, переменная ENVIRONMENT
, определенная в index.php
, была установлена на 'production'
. Это заставило error_reporting
установить значение 0 (без регистрации). Просто установите его на 'development'
, и вы должны начать видеть сообщения об ошибках в журнале apache.
Выключенный из 500 был вызван отсутствием в поле базы данных двоеточия: -)
Для проектов Symfony обязательно проверяйте файлы в приложении / журналах проекта.
. Подробнее см. в этом сообщении: Отладка 500 ошибок в Symfony 2
Btw, другие фреймворки или CMS используют этот тип поведения.
Другой случай, который произошел со мной, я сделал CURL на некоторых моих страницах и получил внутреннюю ошибку сервера, и ничего не было в журналах apache, даже когда я включил все отчеты об ошибках.
My проблема в том, что в CURL я установил curl_setopt($CR, CURLOPT_FAILONERROR, true);
, который тогда не показал мне свою ошибку, хотя был один, это произошло потому, что ошибка была на уровне фреймворка, а не на PHP, поэтому он не появился в журналах.
Убедитесь, что ваши права на файл верны. Если у apache нет разрешения на чтение файла, он не может записать в журнал.
Скопируйте и вставьте следующее в новый файл .htaccess
и поместите его в корневую папку вашего веб-сайта:
php_flag display_errors on
php_flag display_startup_errors on
Ошибки будут отображаться непосредственно на вашей странице.
Это лучший способ быстро отладить, но не использовать его в течение длительного времени, потому что это может быть нарушение безопасности.
Вам нужно включить журнал ошибок PHP.
Это связано с некоторым случайным сбоем на веб-сервере, когда у вас есть ошибка php, она выдает внутреннюю ошибку 500 (у меня такая же проблема) .
Если вы посмотрите в журнале ошибок PHP, вы должны найти свое решение.
В прошлом у меня не было журналов ошибок в двух случаях:
php_error_log
. .htaccess
, например неправильных настроек модуля перезаписи. В этой ситуации ошибки записываются в файл Apache error_log
.
return @mysql_connect(...
маскировал тот факт, что мне не удалось установить модуль mysql php на новый сервер. глупый я, потраченные часы, извлеченные уроки. – rymo 21 June 2012 в 07:22