2014-01-18 5 views
2

파이썬으로 모듈을 만들려고합니다. map(_ + 2, range(10))과 같은 유효한 문장을 재미있게 쓸 수 있지만, 모르는 이상한 행동이 있습니다 어떻게 대처할 것인가. 현재 구현은 다음과 같습니다._ (밑줄) 변수의 값이 Python 인터프리터에서 예기치 않게 변경됩니다.

class EasyLambda(object): 
    def __add__(self, other): 
     return lambda val: val + other 

_ = EasyLambda() 

각 연산자에는 이와 같은 자체 기능이 있습니다. 이것은 벙어리 구현이며 나중에 _.lower() + '.html'과 같은 것을 가능하게하기 위해 개선 할 것입니다. 문제는, 매직 메소드를 호출 할 때마다 파이썬은 self를 새로운 반환 값으로 대체하는 것처럼 보입니다.이 경우는 람다 (lambda)입니다.

>>> from mymodule import _ 
>>> print _ 
<func.EasyLambda object at 0x2e4ae90> 

>>> add2 = _ + 2 
>>> print add2, _ 
<function <lambda> at 0x2e551b8> <func.EasyLambda object at 0x2e13e90> 

>>> add2(4) 
6 

>>> print add2, _ 
<function <lambda> at 0x2e551b8> 6 # WTF? 

>>> print _, type(_) 
6 <type 'int'> 

>>> _ + 4 
10 

>>> _ 
10 # WTF?? 

>>> 2 + 2 
4 

>>> _ 
6 # WTF??? 

나는 여기에 무슨 일이 일어나고 있는지 전혀 모른다. 이 문제를 해결하고 내 _ object이 예상대로 작동하도록하려면 어떻게해야합니까?

+5

쉘 안에서'_'는 마지막으로 평가 한 결과를 저장하는 데 사용됩니다 .....'_'을 사용하지 마십시오. IDLE/대화식 프롬프트에'2 + 2'를 넣으면됩니다. '_'을 입력하십시오. 4 –

+0

친애하는 영주 -'다시 테스트하고 내 테스트를 편집합니다. –

+5

대화 형 쉘 외부에서는 일반적으로 ugettext 및 현지화를위한 shorcut 이름으로 사용됩니다 ... 가장 단순하다고 생각합니다. 문제는 그 이름을 다음과 같이 사용하는 것을 피하는 것입니다. –

답변

5

_은 대화식 인터프리터가 마지막 평가 결과를 저장하는 데 사용됩니다. 매번 당신이 무언가를하려고 할 때 우연히 귀하의 _을 덮어 씁니다. 또한 _uggettext 등의 바로 가기로 자주 사용됩니다.

특수 식별자는 _ 결과를 저장하기 위해 대화 형 인터프리터에서 사용됩니다 간단한 해결책은 내용의 Python documentation에서 관련 부분을 지적 thefourtheye에 ... 지금은 _

감사를 방지하는 것입니다 마지막 평가의; __builtin__ 모듈에 저장됩니다. 대화 형 모드가 아닌 경우 _은 특별한 의미가 없으며 정의되지 않습니다. see section Import 문.

참고 _은 종종 국제화와 함께 사용됩니다. 이 규칙에 대한 자세한 내용은 gettext 모듈 설명서를 참조하십시오.