2014-07-25 1 views
1

, 나는 내가 같은 행동을 할 파이썬을 해킹하기 위해 노력하고있어 (20)의 제곱근을 반환이해킹 파이썬 : 후위 인수 티카에서

10+10 // Sqrt 

을 할 수 있습니다. 좋아요 :

10+10 // crazy.sqrt 

어떻게? crazy 클래스의 연산자를 재정의합니다. 하지만 후위입니다. 그리고 나는 그것이 내가 INT, 문자열 및 기타의 톤과 같은 클래스를해야 할 것입니다 언급 한 경우 self <operator> other alwyas 상관 없음 운영자 오버라이드 (override) 할 때이 http://rgruet.free.fr/PQR26/PQR2.6.html#SpecialMethods

에 따라 - 나쁜.

이 방법이 있습니까? other 클래스에서 주문을 교환하고 연산자를 재정의하고 싶습니다. (설명 편집 : other이 같은 self 클래스에 인수로 전달됩니다 :) (... 다른 자기 .__ 운영자 __)

+0

무엇을? 나는 당신이'math.sqrt (20)'을 시도하는 것을 이해하지 못한다. ... –

+1

나는 수학적으로와 같은 함수를 호출하기 위해 qick'n'dirty 방법을 추가하려하고있다. __coerce __() 가능성이있는 솔루션을 방금 발견했을 수 있습니다. 그러나 나는 여전히 내 질문에 관심이있다 – Bruno314

+0

왜'10 + 10 // sqrt' 대신'sqrt (10 + 10)'을 쓰겠습니까? 나는 그것에 대해 호소력이있는 것을 이해하지 못한다 ... –

답변

1

어쩌면

class WeirdMath: 
    def __init__(self,v): 
     self.val = v 
    def __floordiv__(self,other): #this tells us to apply whatever function to our value 
     return other(self.val) 

import math 
print WeirdMath(10+10) // math.sqrt 
print WeirdMath(["a","b","c"]) // " .. ".join 

귀하의 요구되는 역할을 할 수 무엇을 forbiddenfruit ($ easy_install forbiddenfruit)

from forbiddenfruit import curse 
def apply(self,method): 
    return method(self) 

curse(object,"apply",apply) 
def cubed(n): 
    return n**3 
(10 + 10).apply(math.sqrt).apply(cubed) 
"a big yellow house".apply(str.split).apply(" != ".join) 
+0

' '10 + 10' 표현 전에 무엇이든 추가하고 싶습니다. (그 생각입니다.) – Bruno314

+0

@ Bruno314 editted answer –

0

당신은 파이썬 ("Hacking Python without Hacking Python" 참조) 또는 IPython에 ("Custom Input Transformations" 참조)이 점을 해킹 할 수 있습니다.

10 + 10 ?? func을 허용하려면 ??이 우선 순위가 낮은 연산자 여야합니다. 그러나 모든 파이썬의 우선 순위가 낮은 연산자는 중요하다 (예 : and) 또는 int (예 : |)에 의미가있다. (Operator Precedence 참조)

옵션 :

  1. pipe처럼 보일 것이다, |로의 해킹. 이것은 AST (Abstract Syntax Tree) 해킹 일 수 있으며 |을 사용하는 가져온 라이브러리를 손상시킬 수 있습니다.
  2. 새 연산자를 해킹합니다 (그러나 중요하므로 //을 사용하지 마십시오). AST 전에 문자열 수준에서 해킹해야합니다.

당신을 위해, 파이썬의와 IPython의 다양한 명령을 활용하고, 모두 귀찮은 해킹을 건너 뛸 정도로 수 있습니다.

먼저 sqrt을 사용하는 대신 파이썬의 전원 연산자를 사용할 수 있습니다.

(10+10) ** 0.5 

은 다음으로, 파이썬/IPython, 밑줄 "_"의 "마지막 결과"를 나타냅니다. 이를 입력 할 수 있습니다

>>> 10 + 10 
20 
>>> sqrt(_) 
4.47213595499958 

(IPython 또한 "14 입력의 결과를"의미하는 _14 또는 Out[14]을 허용하고 _____는 의미 "마지막에서 두 번째 결과"와 "세 번째 대 최종 결과 "라고합니다.)

마지막으로 IPython을 사용하면 줄이 슬래시로 시작하는 경우 괄호 나 쉼표없이 함수를 사용할 수 있습니다. (이에 대한 자세한 정보를 볼 수 IPython에 ?를 입력하거나 here 이동합니다.)

In [6]: 10 + 10 
Out[6]: 20 

In [7]: /sqrt _ 
Out[7]: 4.47213595499958