Также известна как Белая страница смерти или Белый экран смерти . Это происходит, когда отчет об ошибках отключен, и произошла фатальная ошибка (часто синтаксическая ошибка).
Если вы включили протоколирование ошибок, вы найдете конкретное сообщение об ошибке в своем журнале ошибок. Обычно это будет в файле php_errors.log, либо в центральном месте (например, /var/log/apache2
во многих средах Linux), либо в самом каталоге самого скрипта (иногда используется в среде совместного размещения).
Иногда может быть более простым временно отображать ошибки. На белой странице отобразится сообщение об ошибке. Будьте осторожны, потому что эти ошибки видны всем, кто посещает веб-сайт.
Это легко сделать, добавив в начале скрипта следующий код PHP:
ini_set('display_errors', 1); error_reporting(~0);
Код включит отображение ошибок и установит отчетность на самый высокий уровень.
Поскольку во время выполнения ini_set()
он не влияет на синтаксические ошибки синтаксиса. Эти ошибки появятся в журнале. Если вы хотите также отобразить их на выходе (например, в браузере), вам необходимо установить директиву display_startup_errors
на true
. Сделайте это либо в php.ini
, либо в .htaccess
или любом другом методе, который влияет на конфигурацию перед временем выполнения .
Вы можете использовать те же методы для установки параметра log_errors и error_log , чтобы выбрать ваше собственное место в файле журнала.
Если вы посмотрите в журнале или используете дисплей, вы получите гораздо лучшее сообщение об ошибке и строка кода, где ваш скрипт останавливается.
Похожие вопросы:
Связанные ошибки:
next(iter(your_list), None)
, Если your_list
может быть None
:
next(iter(your_list or []), None)
def get_first(iterable, default=None):
if iterable:
for item in iterable:
return item
return default
:
x = get_first(get_first_list())
if x:
...
y = get_first(get_second_list())
if y:
...
Другая опция состоит в том, чтобы встроить вышеупомянутую функцию:
for x in get_first_list() or []:
# process x
break # process at most one item
for y in get_second_list() or []:
# process y
break
Для предотвращения break
Вы могли записать:
for x in yield_first(get_first_list()):
x # process x
for y in yield_first(get_second_list()):
y # process y
, Где:
def yield_first(iterable):
for item in iterable or []:
yield item
return
не идиоматический Python, эквивалентный тернарным операторам C-стиля
cond and true_expr or false_expr
т.е.
list = get_list()
return list and list[0] or None
Используя и - или прием:
a = get_list()
return a and a[0] or None
Вы могли использовать Метод Извлечения . Другими словами, извлечение, которые кодируют в метод, который Вы тогда назвали бы.
я не попытался бы сжать его намного больше, лайнеры кажутся более твердыми читать, чем подробная версия. И если Вы используете Метод Извлечения, это - один лайнер;)
Несколько человек предложили делать что-то вроде этого:
list = get_list()
return list and list[0] or None
, Который работает во многих случаях, но это будет только работать, если список [0] не будет равен 0, Ложь или пустая строка. Если список [0] будет 0, Ложь или пустая строка, метод неправильно не возвратит Ни один.
я создал эту ошибку в своем собственном коде слишком много раз!
def head(iterable):
try:
return iter(iterable).next()
except StopIteration:
return None
print head(xrange(42, 1000) # 42
print head([]) # None
BTW: я переделал бы Ваш общий процесс выполнения программы во что-то вроде этого:
lists = [
["first", "list"],
["second", "list"],
["third", "list"]
]
def do_something(element):
if not element:
return
else:
# do something
pass
for li in lists:
do_something(head(li))
(Предотвращение повторения каждый раз, когда возможный)
try:
return a[0]
except IndexError:
return None
Из любопытства я выполнил синхронизации на двух из решений. Решение, которое использует оператор возврата для преждевременного окончания для цикла, является немного более дорогостоящим на моей машине с Python 2.5.1, я подозреваю, что это имеет отношение к установке повторяемого.
import random
import timeit
def index_first_item(some_list):
if some_list:
return some_list[0]
def return_first_item(some_list):
for item in some_list:
return item
empty_lists = []
for i in range(10000):
empty_lists.append([])
assert empty_lists[0] is not empty_lists[1]
full_lists = []
for i in range(10000):
full_lists.append(list([random.random() for i in range(10)]))
mixed_lists = empty_lists[:50000] + full_lists[:50000]
random.shuffle(mixed_lists)
if __name__ == '__main__':
ENV = 'import firstitem'
test_data = ('empty_lists', 'full_lists', 'mixed_lists')
funcs = ('index_first_item', 'return_first_item')
for data in test_data:
print "%s:" % data
for func in funcs:
t = timeit.Timer('firstitem.%s(firstitem.%s)' % (
func, data), ENV)
times = t.repeat()
avg_time = sum(times) / len(times)
print " %s:" % func
for time in times:
print " %f seconds" % time
print " %f seconds avg." % avg_time
Это синхронизации, которые я получил:
empty_lists: index_first_item: 0.748353 seconds 0.741086 seconds 0.741191 seconds 0.743543 seconds avg. return_first_item: 0.785511 seconds 0.822178 seconds 0.782846 seconds 0.796845 seconds avg. full_lists: index_first_item: 0.762618 seconds 0.788040 seconds 0.786849 seconds 0.779169 seconds avg. return_first_item: 0.802735 seconds 0.878706 seconds 0.808781 seconds 0.830074 seconds avg. mixed_lists: index_first_item: 0.791129 seconds 0.743526 seconds 0.744441 seconds 0.759699 seconds avg. return_first_item: 0.784801 seconds 0.785146 seconds 0.840193 seconds 0.803380 seconds avg.
Откровенно говоря, я не думаю, что существует лучшая идиома: Ваш является ясным и кратким - никакая потребность в чем-либо "лучше". Возможно, но это - действительно вопрос вкуса, Вы могли измениться if len(list) > 0:
с if list:
- пустой список будет всегда оценивать ко Лжи.
На связанной ноте, Python не Perl (никакая предназначенная игра слов!), Вы не должны получать самый прохладный возможный код.
На самом деле, худший код я видел в Python, был также очень прохладный:-), и абсолютно неудобный в сопровождении.
Между прочим, большая часть решения, которое я видел здесь, не учитывает, когда список [0] оценивает ко Лжи (например, пустая строка или нуль) - в этом случае, они все не возвращают Ни один а не корректный элемент.
Решение OP почти там, существует всего несколько вещей сделать его большим количеством Pythonic.
Для одного, нет никакой потребности получить длину списка. Пустые списки в Python оценивают ко Лжи в если проверка. Просто скажите
if list:
Кроме того, это - очень Плохая Идея присвоить переменным то перекрытие с зарезервированными словами. "список" является зарезервированным словом в Python.
Так позволяют нам изменить это на
some_list = get_list()
if some_list:
действительно важный момент А, который здесь пропускает много решений, то, что все функции/методы Python не возвращают Ни один значением по умолчанию . Попробуйте следующее ниже.
def does_nothing():
pass
foo = does_nothing()
print foo
, Если Вы не должны возвращать Ни один для завершения функции рано, является ненужным явно не возвратить Ни один. Вполне кратко просто возвратите первую запись, должен она существовать.
some_list = get_list()
if some_list:
return list[0]
И наконец, возможно, это подразумевалось, но только быть явным (потому что явный лучше, чем неявный ), у Вас не должно быть своей функции, получают список от другой функции; просто передайте его в в качестве параметра. Так, конечный результат был бы
def get_first_item(some_list):
if some_list:
return list[0]
my_list = get_list()
first_item = get_first_item(my_list)
, Как я сказал, OP был почти там, и всего несколько касаний дают ему разновидность Python, которую Вы ищете.
(get_list() or [None])[0]
, Который должен работать.
BTW я не использовал переменную list
, потому что это перезаписывает встроенное list()
функция.
Редактирование: у Меня была немного более простая, но неверная версия здесь ранее.
Лучший способ - это:
a = get_list()
return a[0] if a else None
Вы могли также сделать это в одной строке, но программисту намного более трудно читать:
return (get_list()[:1] or [None])[0]