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

Allow reserved key words as methods in CPython

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

class A:
   def finally(self):
       return 0

returns一个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 中也会出现同样的错误。

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

我不知道有任何此类标志,但我想这将是一项艰巨的壮举,因为保留关键字是 baked into the very grammar of Python. You'd have to make some structural changes to allow keywords to be used as method names. It could be easy, but one would have to have knowledge about Python's grammar and how it translates to C. You can start by looking into the Tools 部分,尤其是 peg_generator 和解析器项目。

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

这在 Python 中是不可能的。如果名称将被保留(例如 finally_),则周围的 standard way 是附加下划线。否则你可以选择一个不同的名字。

在您的特定情况下,您拥有的是 JavaScript 代码,因此不清楚为什么您希望它也是有效的 Python 代码。如果它不是您需要在 Python-land 中执行的东西,那么它可能应该是一个字符串而不是原始代码;可能有一种方法可以告诉 cross-compiler 发出作为字符串提供的 JavaScript 代码。如果确实需要在Python-land中执行,那么getattr(promise, 'finally')会取回;定义一个辅助函数来处理 Python 中的 JavaScript promises 可能会很方便,这样你就不必在任何地方都写 getattr