【问题标题】:Allow reserved key words as methods in CPython允许保留关键字作为 Python 中的方法
【发布时间】:2021-01-31 10:30:47
【问题描述】:

看起来 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 中也会发生同样的错误。

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

【问题讨论】:

  • Javascript 在某些情况下不遗余力地允许关键字作为标识符,但 Python 不允许,而且我知道的大多数语言都不允许。 Python 也没有 C# 的 verbatim identifier 语法。如果您直接生成字节码,您正在寻找的可能是可能的,但在源代码级别,不。

标签: python syntax-error cpython pyodide


【解决方案1】:

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

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

【讨论】:

  • 可能参考/引用 PEP 8 说“single_trailing_underscore_:按惯例使用以避免与 Python 关键字冲突”。
  • 谢谢!我的用例是 pyodide 允许你获取一个 JS 对象(比如一个 Promise),在 Python 中创建一个代理对象并在那里使用它pyodide.readthedocs.io/en/latest/type_conversions.html。因此,对于 JS Promise,它将是一个带有 finally 方法的 Python 对象。 getattr 确实可以工作,但我正在寻找更优雅的解决方案。更改此代理对象以将 _ 添加到受限方法名称也可能是一种解决方案。
【解决方案2】:

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

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

【讨论】:

  • 感谢调查!这也是我对情况的评价,确实可能不值得付出努力。
猜你喜欢
  • 1970-01-01
  • 2011-05-14
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 2010-10-09
相关资源
最近更新 更多