【问题标题】:My code works in Python 3.8, but the same code does not work in Python 3.5我的代码适用于 Python 3.8,但相同的代码不适用于 Python 3.5
【发布时间】:2020-11-27 18:50:32
【问题描述】:

我的代码在 Python 3.8 中完美运行,但是当我在相同的操作系统中切换到 Python 3.5,使用相同的代码和其他所有内容时,它开始抛出“SyntaxError: invalid syntax”。

这是错误,以及我认为与错误相关的代码部分:

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 一起使用。谢谢。

【问题讨论】:

  • 那么...您是否查看过 Python 3.6、3.7 和 3.8 的发行说明,了解它们各自的主要变化是什么?您是否尝试过使用其他版本的 Python 来缩小开始工作的特定版本?
  • 如果你需要它以最少的重构工作,也许看看attrs

标签: python python-3.x python-dataclasses python-class


【解决方案1】:

这里至少有两个问题:

  1. Variable annotations 是 Python 3.6 中的新功能。

  2. dataclasses 模块是 Python 3.7 中的新模块。

要么使用 Python 3.7 或更高版本,要么重写您的代码,使其不依赖于数据类和变量注释。

这是在开发中使用与您打算在生产中使用的相同版本的 Python 是个好主意的众多原因之一。您可以避免编写无法在您的服务器上运行的代码。

【讨论】:

  • 超越数据类,3.5 仅支持注释函数参数 (PEP 484),3.6 增加了对变量的支持 (PEP 526)。这就是为什么会出现语法错误而不仅仅是导入错误,解释器甚至没有达到无法导入dataclasses的阶段。
  • @Masklinn,你是对的,还有另一个答案(和评论)说同样的话。但看起来它的作者出于某种原因删除了它。我会把它纳入我的答案中。
【解决方案2】:

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)

【讨论】:

  • “即将推出 Python 3.7”? Python 3.7 于两年多前于 2018 年 6 月发布,而 Python 3.9 即将问世。
  • “数据类是 Python 3.7 的新特性之一。使用数据类,您不必编写样板代码来为您的对象获得正确的初始化、表示和比较。” realpython.com/python-data-classes/…@chris
  • 我知道,但你的回答听起来像是一个全新的功能,甚至还没有发布。事实上,它在 Python 的稳定版本中已经有 26 个月左右的时间了。
  • (对于它的价值,我没有否决你的答案。)
猜你喜欢
  • 2022-10-01
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 2016-03-16
  • 1970-01-01
相关资源
最近更新 更多