Как использовать имя переменной зарезервированных слов в Python - PullRequest
2 голосов
/ 24 мая 2019

Я столкнулся с проблемой, когда использую peewee в python для извлечения данных столбца с именем 'class'. Но «класс» - зарезервированное слово, когда я запускаю код, он всегда останавливается с «SyntaxError: неверный синтаксис».

Вот код, который я использую, который работает, если я не включаю столбец Class.class.

query = (
    Student.select(
        Student.id,
        Student.name,
        Student.school_id,
        School.name,
        Student.class_id,
        Class.class,
        Class.grade,
    )
    .join(Class, join_type=pw.JOIN.INNER, on=(Class.id == Student.class_id))
    .join(School, join_type=pw.JOIN.INNER, on=(School.id == Student.school_id))
    .where(Student.id == id)
)

И определение Class.class, которое также вызывает ту же ошибку:

class = CharField(max_length=45)

Это должно дать мне запрос без ошибок. Поэтому мой вопрос заключается в том, как мне использовать переменные зарезервированного имени в Python. Спасибо!

Ответы [ 3 ]

5 голосов
/ 24 мая 2019

Как правило, вы можете использовать getattr для доступа к именам, которые являются зарезервированными ключевыми словами;для атрибута class:

query = (
    Student.select(
        Student.id,
        Student.name,
        Student.school_id,
        School.name,
        Student.class_id,
        getattr(Class, 'class'),  # equivalent to `Class.class` (if that were allowed)
        Class.grade,
    )
    .join(Class, join_type=pw.JOIN.INNER, on=(Class.id == Student.class_id))
    .join(School, join_type=pw.JOIN.INNER, on=(School.id == Student.school_id))
    .where(Student.id == id)
)

Однако вы, вероятно, захотите переименовать атрибут в определении таблицы Peewee на что-то, что не является зарезервированным словом, и используйте column_name='class', чтобы иметьон по-прежнему ссылается на атрибут class в физической таблице:

klass = CharField(max_length=45, column_name='class')
# or maybe, if you prefer:
class_ = CharField(max_length=45, column_name='class')
1 голос
/ 24 мая 2019

Вы должны назвать атрибут класса class_ (или что-то не зарезервированное), а затем использовать параметр column_name для поля Peewee, чтобы установить его в "class."

0 голосов
/ 24 мая 2019

Невозможно использовать зарезервированное слово таким образом, но обычно добавляется подчеркивание, чтобы избежать столкновения, такого как class_, чтобы ваш код использовал Class.class_ или даже Class_.class_

...