Главный ответ отличный. Вот что я должен был на обычной установке debian / php / mysql:
// storage
// debian. apparently already utf-8
// retrieval
// the mysql database was stored in utf-8,
// but apparently php was requesting iso. this worked:
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');
// delivery
// php.ini did not have a default charset,
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');
// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.
// processing
// changed a few commands in php, like substr,
// to mb_substr
, которая была всем!
Это новая функция в Python 3.3 (как отмечает комментарий, она даже не работает в 3.2). Подобно return
в генераторе уже давно эквивалентен raise StopIteration()
, return <something>
в генераторе теперь эквивалентен raise StopIteration(<something>)
. По этой причине исключение, которое вы видите, должно быть напечатано как StopIteration: 3
, и это значение доступно через атрибут value
для объекта исключения. Если генератор делегирован использовать синтаксис (также новый) yield from
, это результат. Подробнее см. PEP 380 .
def f():
return 1
yield 2
def g():
x = yield from f()
print(x)
# g is still a generator so we need to iterate to run it:
for _ in g():
pass
Отправляет 1
, но не 2
.
Возвращаемое значение не игнорируется, но только генераторы дают значения , а return
просто заканчивает генератор, в этом случае раньше. Продвижение генератора никогда не достигает инструкции yield
в этом случае.
Всякий раз, когда итератор достигает «конца» значений для выхода, появляется StopIteration
. Генераторы не являются исключением. Однако с Python 3.3 любое выражение return
становится значением исключения:
>>> def gen():
... return 3
... yield 2
...
>>> try:
... next(gen())
... except StopIteration as ex:
... e = ex
...
>>> e
StopIteration(3,)
>>> e.value
3
Используйте функцию next()
для продвижения итераторов вместо прямого вызова .__next__()
:
print(next(x))