Мой код работает в Python 3.8, но тот же код не работает в Python 3.5.

мой код отлично работает в Python 3.8, но когда я переключаюсь на Python 3.5 в той же операционной системе, с тем же кодом и всем остальным, он начинает выбрасывать SyntaxError: недопустимый синтаксис.

Вот ошибка и часть кода, которая, как я думаю, относится к ошибке:

Traceback (most recent call last):
  File "pwb.py", line 390, in <module>
    if not main():
  File "pwb.py", line 385, in main
    file_package)
  File "pwb.py", line 100, in run_python_file
    exec(compile(source, filename, 'exec', dont_inherit=True),
  File ".\scripts\signbot.py", line 83
    namespace: int
             ^
SyntaxError: invalid syntax
CRITICAL: Exiting due to uncaught exception <class 'SyntaxError'>

А вот часть кода:

@dataclass
class RevisionInfo:
    namespace: int
    title: str
    type: str
    bot: bool
    comment: str
    user: str
    oldRevision: Optional[int]
    newRevision: int
    timestamp: int

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


person Yağızhan Y.    schedule 07.08.2020    source источник
comment
Итак... вы просмотрели примечания к выпуску Python 3.6, 3.7 и 3.8, чтобы узнать, какие основные изменения были в каждом из них? Пробовали ли вы использовать другие версии Python, чтобы сузить конкретную версию, в которой это начинает работать?   -  person Chris    schedule 07.08.2020
comment
Если вам НУЖНО, чтобы он работал с минимальным рефакторингом, возможно, взгляните на attrs.   -  person Mateus Terra    schedule 15.08.2020


Ответы (2)


Здесь есть как минимум две проблемы:

  1. Аннотации переменных были новыми в Python 3.6.

  2. Модуль dataclasses был новым в Python 3.7. .

Либо используйте Python 3.7 или выше, либо перепишите свой код, чтобы он не зависел от классов данных и аннотаций переменных.

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

person Chris    schedule 07.08.2020
comment
Помимо классов данных, версия 3.5 поддерживала только аннотирующие параметры функции (PEP 484), в версии 3.6 добавлена ​​поддержка переменных (PEP 526). Вот почему возникает синтаксическая ошибка, а не просто ошибка импорта, интерпретатор даже не доходит до стадии невозможности импорта dataclasses. - person Masklinn; 07.08.2020
comment
@Masklinn, ты прав, и был другой ответ (и комментарий), говорящий то же самое. Но похоже, что его автор удалил его по какой-то причине. Я включу это в свой ответ. - person Chris; 07.08.2020

В Python 3.7 появилась новая интересная функция — класс данных. вы не можете использовать его в python 3.5. Вы должны использовать традиционный способ и использовать конструктор:

class Mapping:
def __init__(self, iterable):
    self.items_list = []
    self.__update(iterable)

def update(self, iterable):
    for item in iterable:
        self.items_list.append(item)
person Amin MAG    schedule 07.08.2020
comment
появится в Python 3.7? Python 3.7 был выпущен более двух лет назад, в июне 2018 года, и вот-вот должен выйти Python 3.9. - person Chris; 07.08.2020
comment
Классы данных — одна из новых функций Python 3.7. С классами данных вам не нужно писать шаблонный код, чтобы получить правильную инициализацию, представление и сравнение для ваших объектов. realpython.com/python-data-classes/ @chris - person Amin MAG; 07.08.2020
comment
Я знаю это, но ваш ответ звучит так, будто это совершенно новая функция, которая еще даже не выпущена. На самом деле, он находится в стабильной версии Python уже 26 месяцев или около того. - person Chris; 07.08.2020
comment
(Что бы это ни стоило, я не понизил ваш ответ.) - person Chris; 07.08.2020