2016-07-12 43 views
4

考慮例如四元數學(https://en.wikipedia.org/wiki/Quaternion)。我可以創建一個將由非平凡語法創建的類嗎?

很顯然,我可以建立一個類,將通過

a = quaternion(1, 2, 3, 4) 
print(a) 
# 1 + 2i + 3j + 4k 

定義一個新的四元數然而,通過使用

a = 1 + 2j 
type(a) 
# complex or <class 'complex'> depending if ipython or python 
一個不能不注意到,本機 complex數據類型可以在一個更漂亮的方式來定義

以某種方式捕獲1 + 2j語法來創建內置類對象複合體(1,2)。

那麼,我可以這樣做嗎?有沒有辦法捕獲簡單的直接語法,如a = 1 + 2i + 3j + 4k,並將其翻譯爲我的a = quartenion(1, 2, 3, 4),其方式與內置的complex的工作方式類似?

+1

「j」後綴是Python語言語法的一部分。所以 - 除非你想擴展核心Python,唯一實際的方法是讓你的'Quaternion'類接受一個字符串並適當地解析它......你可能會發現[sympy](http://docs.sympy.org/dev /index.html)在這裏使用。 –

+0

@JonClements - 好點。但是如果我們用一個更安全的鍵取代j,python還沒有使用它呢? '1 + 2i + 3h + 4k'?我試圖理解是否原則上可能捕獲這樣的語法... – Aguy

+2

不適用 - 因爲當Python根據其語法定義解析代碼時,它會引發'SyntaxError's。在不修改核心Python的情況下完成它的唯一方法是自己接收字符串並進行解析。 –

回答

2

簡答:不,你不能。

長答案:嗯,你可以,但它不是蟒蛇了。

解析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來解析字符串中的四元數。

第三個也是最枯燥的方法是試圖讓Quaternion集成到python語言中。這需要發佈在python-ideas(並且先做一些研究,然後看看它是否曾經討論過,以及討論是如何演變的;在最初的討論中包括這一點,以防止線索快速死亡),以查看您的建議是否獲得了推動力。然後在編寫PEP並獲得批准之後,以及CPython python實現中的實現。

(最後一段基本上是我從現在開始閱讀Python思路幾年想通了,它可能不會像我可能會錯過一些細微或步驟的正式文件的過程。)

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 

這不完全是你想要的語法,但它接近它並具有相同的含義。

相關問題