다중 변수가 없음이 아닌지 확인하는 가장 단순한 방법은 무엇입니까?
이와 같은 구조를 가진 경우:
def foo():
a=None
b=None
c=None
#...loop over a config file or command line options...
if a is not None and b is not None and c is not None:
doSomething(a,b,c)
else:
print "A config parameter is missing..."
모든 변수가 유용한 값으로 설정되었는지 확인하기 위해 python에서 선호하는 구문은 무엇입니까?제가 쓴 대로인가요, 아니면 다른 더 나은 방법인가요?
이것은 이 질문과 다릅니다. Python에서 None 테스트가 아닙니다...나는 많은 조건이 없음이 아닌지 확인하기 위해 선호하는 방법을 찾고 있습니다.제가 입력한 옵션은 매우 길고 비직관적인 것 같습니다.
훨씬 더 간단하게 할 수 있습니다, 정말로.
if None not in (a, b, c, d):
pass
업데이트:
slashCoder가 정확히 언급했듯이, 위의 코드는 암시적으로 a == 없음, b == 없음 등을 수행합니다.이 관행은 눈살을 찌푸리게 합니다.equal 연산자를 오버로드할 수 있으며 None이 아닌 None이 None과 같을 수 있습니다.당신은 그런 일은 절대 일어나지 않는다고 말할지도 모릅니다.글쎄요, 그렇게 되기 전까지는 그렇지 않습니다.따라서 안전한 측면에서, 만약 당신이 어떤 물체도 없음을 확인하고 싶다면, 당신은 이 접근 방식을 사용할 수 있습니다.
if not [x for x in (a, b, c, d) if x is None]:
pass
그것은 조금 느리고 표현력이 떨어지지만, 여전히 빠르고 짧습니다.
당신이 그것을 하는 방식에는 아무 문제가 없습니다.
변수가 많은 경우 목록에 추가하여 사용할 수 있습니다.all
:
if all(v is not None for v in [A, B, C, D, E]):
이것이 오래된 질문이라는 것을 알지만, 저는 제가 더 낫다고 믿는 답변을 추가하고 싶었습니다.
확인해야 하는 모든 요소가 해시 가능한 경우 목록이나 튜플 대신 세트를 사용할 수 있습니다.
>>> None not in {1, 84, 'String', (6, 'Tuple'), 3}
이것은 다른 답변의 방법보다 훨씬 빠릅니다.
$ python3 -m timeit "all(v is not None for v in [1, 84, 'String', (6, 'Tuple'), 3])"
200000 loops, best of 5: 999 nsec per loop
$ python3 -m timeit "None not in [1, 84, 'String', (6, 'Tuple'), 3]"
2000000 loops, best of 5: 184 nsec per loop
$ python3 -m timeit "None not in (1, 84, 'String', (6, 'Tuple'), 3)"
2000000 loops, best of 5: 184 nsec per loop
python3 -m timeit "None not in {1, 84, 'String', (6, 'Tuple'), 3}"
5000000 loops, best of 5: 48.6 nsec per loop
이 방법의 또 다른 장점은 누군가가 다음을 정의하더라도 올바른 답을 제공한다는 것입니다.__eq__
클래스가 항상 반환되는 방법True
(물론, 그들이 정의한다면.__hash__
하는 방법.return hash(None)
이 방법은 효과가 없습니다.그러나 해시를 정의하는 목적을 훼손할 수 있으므로 아무도 그렇게 해서는 안 됩니다.)
class Int(int):
def __eq__(self, other):
return True
def __hash__(self):
return hash(super())
print(all(v is not None for v in [1, Int(6), 2])) # True (correct)
print(None not in [1, Int(6), 2]) # False (wrong)
print(None not in (1, Int(6), 2)) # False (wrong)
print(None not in {1, Int(6), 2}) # True (correct)
편집: Mo2에서 언급한 바와 같이, 이 솔루션은 변수가 다음과 같이 설정되면 실패합니다.0
그리고.0
는 '경고' 값으로 간주됩니다.
OP가 제시한 특정 사례에 대하여
if not all([a, b, c])
충분할 것입니다.
all([a, b, c])
매개 변수가 누락된 경우 False로 평가됩니다.
언급URL : https://stackoverflow.com/questions/42360956/what-is-the-most-pythonic-way-to-check-if-multiple-variables-are-not-none
'programing' 카테고리의 다른 글
Mac에서 pipas 루트로 실행할 때 "권한 거부"를 받는 중 (0) | 2023.07.23 |
---|---|
패키지 사양의 절차 (0) | 2023.07.23 |
numpy의 배열에서 축은 어떻게 인덱싱됩니까? (0) | 2023.07.23 |
장고에서 한 앱에서 다른 앱으로 외부 키. (0) | 2023.07.23 |
SpringCloud Gateway - 수신 요청 URL 및 해당 경로 URI 기록 (0) | 2023.07.18 |