그렇지 않은 경우이를 수행하는 가장 좋은 방법은 무엇입니까?
지금 나는 (django 프로젝트를 위해)하고있다.
if not 'thing_for_purpose' in request.session:
request.session['thing_for_purpose'] = 5
하지만 꽤 어색합니다. Ruby에서는 다음과 같습니다.
request.session['thing_for_purpose'] ||= 5
훨씬 좋습니다.
그렇지 않은 경우이를 수행하는 가장 좋은 방법은 무엇입니까?
지금 나는 (django 프로젝트를 위해)하고있다.
if not 'thing_for_purpose' in request.session:
request.session['thing_for_purpose'] = 5
하지만 꽤 어색합니다. Ruby에서는 다음과 같습니다.
request.session['thing_for_purpose'] ||= 5
훨씬 좋습니다.
nil
(부울 컨텍스트에서 false)이 관용구는 sean이 사용한 목적에 정확히 사용되는 경우가 많습니다. 관용구에만 작동하지만, 경우 물론, nil
및 false
(관용구가 미세하므로 매우 자주 사실이다) 해시에없는 정당한 값은
답변:
받아 들여지는 대답은 dicts에 좋지만 제목은 Ruby의 || = 연산자에 해당하는 일반적인 것을 찾습니다. 파이썬에서 || =와 같은 일을하는 일반적인 방법은 다음과 같습니다.
x = x or new_value
x
이전에 정의 된 경우에만 작동합니다 (예 None
: 클래스 초기화 메서드에서로 설정 됨 ).
dict
있습니다 setdefault()
.
그래서 만약 것은 request.session
A는 dict
:
request.session.setdefault('thing_for_purpose', 5)
정확한 답 : 아닙니다 파이썬은 하나가없는 내장 연산자 op
번역 할 수 있습니다 x = x or y
로 x op y
.
그러나 거의 그렇습니다. 비트 또는 같음 연산자 ( |=
) 는 두 피연산자가 모두 부울로 처리되는 경우 위에서 설명한대로 작동합니다. (주의 사항은 무엇입니까? 대답은 물론 아래에 있습니다.)
첫째, 기능의 기본 데모 :
x = True
x
Out[141]: True
x |= True
x
Out[142]: True
x |= False
x
Out[143]: True
x &= False
x
Out[144]: False
x &= True
x
Out[145]: False
x |= False
x
Out[146]: False
x |= True
x
Out[147]: True
주의 할 점은 파이썬이 엄격하게 유형화되지 않았기 때문에 값이 표현식에서 부울로 취급 되더라도 비트 연산자에 주어지면 단락되지 않습니다. 예를 들어 목록을 지우고 True
삭제 된 요소 가있는 경우 반환하는 부울 함수가 있다고 가정합니다 .
def my_clear_list(lst):
if not lst:
return False
else:
del lst[:]
return True
이제 단락 동작을 다음과 같이 볼 수 있습니다.
x = True
lst = [1, 2, 3]
x = x or my_clear_list(lst)
print(x, lst)
Output: True [1, 2, 3]
그러나를 or
비트 단위 또는 ( |
)로 전환하면 단락이 제거되므로 함수가 my_clear_list
실행됩니다.
x = True
lst = [1, 2, 3]
x = x | my_clear_list(lst)
print(x, lst)
Output: True []
위의 x = x | my_clear_list(lst)
는 x |= my_clear_list(lst)
.