我可以创建一个由非平凡语法创建的类吗?

时间:2016-07-12 08:41:54

标签: python

考虑例如四元数数学(https://en.wikipedia.org/wiki/Quaternion)。

显然,我可以通过

构建一个定义新的四元数的类
a = quaternion(1, 2, 3, 4)
print(a)
# 1 + 2i + 3j + 4k

然而,人们不禁注意到可以通过使用

以更好的方式定义本机complex数据类型
a = 1 + 2j
type(a)
# complex or <class 'complex'> depending if ipython or python

以某种方式捕获1 + 2j语法以创建内置类对象complex(1,2)。

那么,我可以这样做吗?有没有办法捕获简单的直接语法,例如a = 1 + 2i + 3j + 4k,并以类似于内置a = quartenion(1, 2, 3, 4)的工作方式将其翻译为complex

2 个答案:

答案 0 :(得分:4)

您可以定义单位四元数,定义加法和减法以使用简单数字,然后只需编写表达式。

# quaternion.py
...
i = quaternion(0, 1, 0, 0)
j = quaternion(0, 0, 1, 0)
k = quaternion(0, 0, 0, 1)

# main.py
from quaternion import i,j,k
a = 1 + 2*i + 3*j + 4*k

这不完全是你想要的语法,但它接近它并具有相同的含义。

答案 1 :(得分:2)

简答:不,你不能。

答案很长:嗯,你可以,但那不再是python了。

解析python时会处理复杂的文字。它们是具有自定义语法的python语言的良好集成部分。你不能简单地在python中定义自己的自定义语法。它需要修改你的python解析器,这恐怕不是一件容易的事。此外,您的程序将与其他python实现不兼容。

之前有efforts to allow users to define custom string literals(例如在C ++中),但它从来没有获得过牵引力,因为你可以简单地让用户from myquaternionlibrary import q然后使用q("1 + 2j + 3k + 4h"),这只是两个字符多于自定义字符串文字。您将实现q以从字符串中解析四元数。

第三种也是最乏味的方法是尝试将Quaternions集成到python语言中。这需要在python-ideas上发布(并在之前进行一些研究,看看之前是否已经讨论过以及讨论是如何演变的;在初步讨论中包括这些以防止你的线程快速死亡)看看你的建议获得牵引力。然后编写PEP并获得批准,以及CPython python实现中的实现。

(最后一段基本上是我几年来从阅读python-ideas中想到的,它可能不是正式记录的过程,因为我可能会错过一些细微差别或步骤。)