2

看起来 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

4

2 回答 2

3

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

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

于 2020-10-17T03:03:51.307 回答
2

我不知道有任何此类标志,但我想这将是一项艰巨的壮举,因为保留关键字如何融入Python 的语法。您必须进行一些结构更改以允许将关键字用作方法名称。这可能很容易,但必须了解 Python 的语法以及它如何转换为 C。您可以从查看“工具”部分开始,特别是 peg_generator 和解析器项目。

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

于 2020-10-16T22:51:25.200 回答