2016-07-12 9 views
4

たとえば、クォータニオン数学(https://en.wikipedia.org/wiki/Quaternion)を考えてみましょう。わかりやすい構文で作成されるクラスを作成できますか?

もちろん、私はしかし、1がネイティブcomplexデータ型は

a = 1 + 2j 
type(a) 
# complex or <class 'complex'> depending if ipython or python 
を使用することによって非常に良く方法で定義することができることを気付いて助けることができない

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

によって新しい四元数を定義するクラスを構築することができます

1 + 2jの構文は何とかキャプチャされ、組み込みクラスオブジェクト複合体(1,2)が作成されます。

私は同じことをすることはできますか? a = 1 + 2i + 3j + 4kのような簡単な直接構文を捕捉し、complexの仕組みと同じように私のa = quartenion(1, 2, 3, 4)に変換する方法はありますか?

+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パーサーを変更する必要がありますが、これは簡単な作業ではありません。また、あなたのプログラムは他のPythonの実装と互換性がありません。あなたは、単にリテラルのカスタム文字列よりも2つだけ文字以上である、ユーザーfrom myquaternionlibrary import qを行い、その後、q("1 + 2j + 3k + 4h")を使用することができますよう

前に(例えばC++のように)efforts to allow users to define custom string literalsがありました、しかし、それは、牽引力を得たことはありません。文字列から四元数を解析するには、qを実装します。

第3の最も退屈なやり方は、Quaternionsを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 

これは正確にはあなたが望む構文ではありませんが、それはそれに近く、同じ意味を持ちます。

関連する問題