2011-07-28 2 views
0

나는 장고 쿼리를 실행하려고 해요 :이 맞다면 내가 궁금하네요파이썬에서 ** kwargs는 열심히 또는 게으른가요?

#att.name is a string 
kwargs = {att.name : F('node__product__' + att.name) } 
temps = Temp.objects.exclude(**kwargs) 

. 지금까지 필자가 보았던 모든 예제는 값에서 문자열을 사용하지만, 값이 함수라면,이 값을 문자열처럼 만들어야합니까?

kwargs = {att.name : 'F('node__product__' + att.name)' } 

는 값의 함수는 인수 목록에서 열심히 실행 얻을 않거나 필요할 때까지 기다려야합니까?

+1

게으른 일은 아무것도 없습니다. 두 번째 형식은 구문 분석하지 않습니다. –

+1

은''kwargs = {att.name : "F ('node__product__'+ att.name)"}'라고 가정하는 것이 합리적입니까? – SingleNegationElimination

답변

5

파이썬에서 표현은 항상 열심히 평가됩니다. 파이썬에는 게으른 평가가 없습니다. 일부 라이브러리는 특정 유형이어야하는 값을 나중에 문자열이되도록 허용함으로써이 유용한 기능이 없어진다. 나중에 eval이된다. django 모델의 일부분을 이렇게 선언 할 수 있기 때문에 (참조 할 수있는 서로 다른 foreign key 관계를 선언 할 수있다) django의 질의 인터페이스는 그렇지 않다. 문자열이 "예상"일 때 일반적으로 이런 종류의 기술을 사용할 수 없습니다. 왜냐하면 문자열 값과 eval이되어야하는 문자열을 구별 할 방법이 없기 때문입니다.

+3

lambda 함수 또는 함수 객체를 전달하여 지연 평가를 시뮬레이션 할 수 있습니다. 이것은 평가되는 문자열을 만드는 것보다 바람직합니다. –

+0

"순도"의 이유로 좋을 수도 있지만 "Foo.bar"는'lambda : Foo.bar'보다 읽기 쉽고 이상적인'Foo.bar'에 더 가깝고 문자열 형식은 여전히 ​​일반적입니다.어떤 종류의 문자열이 필요한지 알고 있다면, 'eval'을 피할 수 있습니다. 영리한 것을 호출 할 수 있어야합니다. – SingleNegationElimination

+2

생성자와 생성자 표현식이 "느리게"평가된다는 논쟁이 있습니다. – senderle

0

만 첫 번째는 올바른 : 나는/열망이 질문에 어떻게 연관되는지 게으른 이해하지

kwargs = {att.name : F('node__product__' + att.name) } 
temps = Temp.objects.exclude(**kwargs) 

.

0

함수 인수는 함수가 호출되기 전에 평가됩니다

>>> def foo(x): return x 
...: 

>>> foo(sum(range(10))) 
<<< 45 

당신이 DICT 모든 것을 만들

가 그 순간에 평가된다 : 그래서

>>> kwargs = {'key': sum(range(10))} 

>>> kwargs 
<<< {'key': 45} 

...

>>> def foo(**kwargs): return kwargs 
...: 

>>> foo(**kwargs) 
<<< {'key': 45} 
0

호기심이 있거나이 방법을 찾기 위해이 질문이 맞는지 잘 모르겠습니다. 짐을 적재하십시오.

나는 이런 식으로 뭔가있을 것 Temp.objects.exclude에 그들을 설정 나중에하는을 사용하는 인수에 그들을로드 어쩌면 Q() 함수를 사용 할 것

:

그래서 내가 추측 걸릴 것입니다 쿼리는 Q (att.name = F (' 제품 node_ _'+ att.name)) 또는 Q 객체들의 더 많은 것이다
def mylolfunc(self, *args,**kwargs): 
    queryset = Q() 
    for query in args: 
     queryset |= query 
return Temp.objects.filter(queryset) 

.

체크 아웃하려면 documentation입니다.

이 쿼리는 정보를 요청하기 전까지 실행되지 않으므로 게으릅니다. 당신이 뭔가를 할 때까지 내 말은 ..

myquery = mylolfunc(*args) 
myquery[0] #-----> executes query here 
관련 문제