允许将保留的关键字作为CPython中的方法

问题描述

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

class A:
   def finally(self):
       return 0

返回一个SyntaxError: invalid Syntaxgetattr/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。而且由于目前的限制,目前,诸如Promise.new(...).then(...).finally(...)之类的Python代码会因语法错误(cf GH-pyodide#769)而出错

解决方法

这在Python中是不可能的。如果要保留名称,standard way周围要加上下划线(例如finally_)。否则,您可以选择其他名称。

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

,

我不知道任何这样的标志,但我想这将是一个艰巨的壮举,因为保留关键字如何baked成为Python的语法。您必须进行一些结构上的更改,以允许将关键字用作方法名称。这可能很容易,但是必须要了解Python的语法及其如何转换为C。您可以从研究Tools部分开始,尤其是peg_generator和parser项目。

希望比我知识渊博的人能够给出更令人满意的答案。