2016-07-12 3 views
4

예를 들어 쿼터니온 수학 (https://en.wikipedia.org/wiki/Quaternion)을 고려하십시오.간단한 구문으로 생성 될 클래스를 만들 수 있습니까?

분명히 나는 ​​하나

a = 1 + 2j 
type(a) 
# complex or <class 'complex'> depending if ipython or python 
를 사용하여 기본 complex 데이터 형식이 훨씬 더 좋은 방법으로 정의 될 수 있다는 것을 알아 차리지 도움이되지 수 있습니다, 그러나

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

하여 새로운 사원 수를 정의하는 클래스를 구축 할 수 있습니다

1 + 2j 구문은 어떻게 든 내장 클래스 개체 complex (1,2)를 만들기 위해 캡처됩니다.

그래도 동일한 작업을 수행 할 수 있습니까? a = 1 + 2i + 3j + 4k과 같은 간단한 직접 구문을 캡처하고 내 complex의 작동 방식과 비슷한 방식으로이 코드를 내 으로 변환 할 수 있습니까?

+1

'j '접미사는 파이썬의 언어 구문의 일부입니다. 그래서 당신이 핵심 파이썬을 확장한다고 생각하지 않는다면, 유일하게 실제적인 방법은'Quaternion' 클래스가 문자열을 받아들이고 그것을 적절하게 파싱하는 것입니다. [sympy] (http://docs.sympy.org/dev /index.html)를 사용하십시오. –

+0

@JonClements - 좋은 지적. 그러나 우리가 j를 안전한 키로 대체한다면, 아직 파이썬에서 사용하지 않을 수 있습니까? '1 + 2i + 3h + 4k'? 이러한 구문을 캡처하는 것이 원칙적으로 가능한지 이해하려고 노력 중입니다 ... – Aguy

+2

아니요 - 파이썬이 구문 정의에 따라 코드를 구문 분석 할 때 'SyntaxError'가 발생합니다.핵심 파이썬을 수정하지 않고 그것을 수행하는 유일한 방법은 문자열을 가져 와서 직접 파싱하는 것입니다. –

답변

2

짧은 대답 : 아니요, 할 수 없습니다.

긴 답변 : 글쎄, 할 수는 있지만 더 이상 파이썬이 아닙니다.

복잡한 리터럴은 파이썬을 구문 분석 할 때 처리됩니다. 그것들은 사용자 정의 구문을 사용하여 파이썬 언어의 잘 통합 된 부분입니다. 파이썬에서 사용자 정의 구문을 정의 할 수는 없습니다. 파이썬 파서를 수정해야하는데, 쉬운 일이 아닙니다. 두려워합니다. 또한, 귀하의 프로그램은 다른 파이썬 구현과 호환되지 않을 것입니다.

efforts to allow users to define custom string literals을가 있었다 (예 : C에서와 같이 ++) 당신이 단순히 사용자 from myquaternionlibrary import q을 한 후 문자 사용자 정의 문자열에 비해 두 문자 이상 q("1 + 2j + 3k + 4h")을 사용할 수 있기 전에, 그러나, 그것은, 견인을 얻을하지 않습니다. 문자열에서 쿼터니언을 파싱하려면 q을 구현합니다.

세 번째이자 가장 지루한 방법은 Quaternions를 파이썬 언어로 통합하려고 시도하는 것입니다. 이것은 python-ideas에 게시해야하며 (토론을 진행하기 전에 미리 논의 해 보았는지, 토론이 진화했는지 확인하기 위해 사전 조사를 해보고, 스레드가 빨리 죽지 않도록 초기 논의에 포함 시키십시오) 제안 사항이 견인력을 얻는 지 확인하십시오. 그런 다음 PEP를 작성하고 CPython 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 

정확한 구문은 아니지만 거의 비슷하지만 의미가 같습니다.

관련 문제