首页 > 解决方案 > 允许保留关键字作为 CPython 中的方法

问题描述

看起来 Python 有一个不能用作方法名称的保留关键字列表。例如,

class A:
   def finally(self):
       return 0

返回一个SyntaxError: invalid syntax。有一种方法可以解决它getattr/setattr

  class A:
      pass
  

  setattr(A, 'finally', lambda self: 0)
  
  a = A()
  print(getattr(a, "finally")())

工作正常。但是,a.finally()仍然会产生一个SyntaxError: invalid syntax.

有没有办法避免它?更具体地说,从源代码(或代码补丁)编译 CPython 3.8 时是否有一些设置可以避免此错误?

请注意,同样的错误发生在 PyPy 3 中。

上下文是在将 CPython 构建到 WebAssembly 的 Pyodide 中,可以将 Javascripts 对象传递给 Python。并且由于目前的限制,目前,Python 代码Promise.new(...).then(...).finally(...)会出现语法错误(参见GH-pyodide#769

标签: pythonsyntax-errorcpythonpyodide

解决方案


这在 Python 中是不可能的。解决此问题的标准方法是在保留名称时附加下划线(例如finally_)。否则,您可以选择不同的名称。

在您的特定情况下,您拥有的是 JavaScript 代码,因此不清楚为什么您希望它也是有效的 Python 代码。如果它不是你需要在 Python 领域执行的东西,那么它可能应该是一个字符串而不是原始代码;可能有一种方法可以告诉交叉编译器发出作为字符串提供的 JavaScript 代码。如果您确实需要在 Python 中执行它,那么getattr(promise, 'finally')将检索它;在 Python 中定义一个用于处理 JavaScript 承诺的辅助函数可能会很方便,这样您就不必getattr到处编写了。


推荐阅读