考虑例如四元数数学(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
?
答案 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中想到的,它可能不是正式记录的过程,因为我可能会错过一些细微差别或步骤。)