사용

2012-09-06 6 views
5

, 나는사용

'app_date': lambda *a: time.strftime('%Y-%m-%d')

내가 아는 다음 코드 조각을 람다 is.My 질문 왜 사용하는 람다? 왜 그냥

무엇 발견

'app_date': time.strftime('%Y-%m-%d')

답변

13

'app_date': time.strftime('%Y-%m-%d')은 즉시 time.strftime을 평가합니다. 그것을 람다로 감싸는 것에 의해, 그 실행은 나중 (람다를 호출 할 때)까지 연기된다. 대충 말하자면 "내가 이것을 정의한 때"와 "내가 이것을 사용할 때"의 차이가 있습니다. 봐 : 나는 각 d['a'], d['b']() 사이의 경과 시간을 허용

>>> d = {'a': time.time(), 'b': lambda: time.time()} 
>>> d['a'], d['b']() 
(1346913545.049, 1346913552.409) 
>>> d['a'], d['b']() 
(1346913545.049, 1346913554.518) 
>>> d['a'], d['b']() 
(1346913545.049, 1346913566.08) 

. d['a']은 항상 동일합니다. 즉, 내가 d으로 정의한 시간입니다. d['b']은 함수입니다. d['b']() (괄호 포함)은 각 호출 시마다 새로운 시간을 평가하는 함수를 호출하므로 사용법마다 다릅니다.

또한이 항목은 lambda에 대한 특별한 내용이 아닙니다. 람다는 다른 모든 기능과 동일합니다. 나는 같은 것을 할 수있다 :

def func(): 
    return time.time() 
d = {'a': time.time(), 'b': func} 
+2

사실 OpenERP 모델의 기본값은 일반적인 함정이다. 대부분의 OpenERP 기본값은 단순한 리터럴 문자열/정수/부울 일 수 있지만 날짜 시간 값은 호출 가능으로 감싸 야합니다. 그렇지 않으면 기본 시간대는 항상 현재 시간이 아닌 서버 시작 날짜와 시간이됩니다. – odony

+0

http : //en.wikipedia.org/wiki/Thunk_(functional_programming). 필자는 성능에 영감을 얻은 게으른 평가의 맥락에서 "썽크 (thunk)"라는 용어를 들었을 뿐이지 만이 시간 관련 예제에도 적용될 수 있습니다. 아무도 몰라? – stalepretzel