问题描述
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。而且由于目前的限制,目前,诸如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项目。
希望比我知识渊博的人能够给出更令人满意的答案。