Проблема заключается в этой части:
`value`
В Python 2.x, это означало то же, что и repr(value)
. Гвидо называл это самой большой ошибкой синтаксиса в Python. По-видимому, это никогда не осуждали, просто зарывали в документах, где никто их никогда не заметит. Но неудивительно, что Python 3 немедленно удалил его с помощью этого краткого объяснения:
Удалены обратные обратные (вместо этого используйте
repr()
).Итак, вы можете исправить это следующим образом:
assert (type(value) == int), "value %s is not an int" % repr(value)
Но на самом деле это именно то, что
%r
для:assert (type(value) == int), "value %r is not an int" % value
Из
printf
-style String Formatting docs:
'r'
String (преобразует любой объект Python с помощьюrepr()
). (5)'s'
String (преобразует любой объект Python с помощьюstr()
). (5)С этим изменением эта строка теперь действует как Python 2.7, так и Python 3.6 (и 2.1 и 3.8pre, если на то пошло).
Если вам повезет, это просто означает, что ваш учитель не совсем поймал все, обновляя свои уроки и задания для Python 3, и он больше не появится. (Хотя вы должны указать это на них.)
Но если ваш учитель на самом деле учит Python 2, а не Python 3, вам, вероятно, нужно будет использовать Python 2.7 вместо 3.6, или у вас будет много больше проблем.
Если вы используете Python 3, и вы не хотите изучать форматирование
printf
-типов, просто обновите его:assert (type(value) == int), f"value {value!r} is not an int"
Вы должны сделать это с помощью динамического SQL. Вы не можете использовать переменные непосредственно в операторе CREATE TABLE.
SET @sql = CONCAT('CREATE TABLE ... DEFAULT CHARSET=', @@character_set_client);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Однако, мне интересно, почему ты это делаешь. Я бы обычно позволял таблице charset по умолчанию использовать charset для схемы. Кажется странным использовать клиентскую кодировку.