2012-07-17 2 views
2

없이 파이썬에서 개체에 액세스하고 abcvariable에 존재하지 않는 경우는 마지막에 nil 가치를 얻을 수 있습니다 및 오류 또는 예외를받지 않습니다. 이것은 정말 편리합니다. 파이썬에서 이와 비슷한 것이 있습니까? 난 당신이안전하게 당신이 <code>[variable valueForKeyPath:@"abc.def"]</code> 또는 <code>[[variable abc] def]</code>을 할 수있는 목표 - C에서 시도/캐치

abc = variable.get('abc', None) 
if abc: 
    def = abc.get('def', None) 

또는

try: 
    def = variable.get('abc').get('def') 
except: 
    pass 

믿을 수 없을만큼 자세한 보인다 (적어도 사전에 대해) 할 수있는 것을 알고있다. 개체의 속성에 액세스하거나 None 값을 얻고 싶을 때 더 쉬운 방법이 있습니까?

+13

짧은 대답 : 아니요 긴 대답 : Nooooooooooooooooooooooooooooo. –

+0

이 용서 행위는 버그로 이어집니다. – Dani

+0

'abc'가'variable'의 메소드가 아니라면 두 번째 ObjC 표현식 _does_이 실제로 충돌합니다. 메시지의 _reciever_ (여기서'variable')가'nil' 인 경우 크래시가 발생하지 않는다고 생각할 수도 있습니다. –

답변

1

원하는 내장 문법이 없습니다. 이 작업을 수행하는 도우미 함수를 작성하거나 collections.defaultdict이 유용 할 수 있습니다. 잘

def = variable.get('abc', {}).get('def',None) 

에 대해, 이것은 단지 DICT을 위해 작동 할 것을

2

당신은 getattr에 중첩 호출을 사용할 수 있습니다

def = getattr(getattr(variable, 'abc', None), 'def', None) 

또한 방법으로 분배 할 수 있습니다, 그리고 단지 붙잡는 것 AttributeError

try: 
    def = variable.abc.def 
except AttributeError: 
    def = None 
1

Python은 진단하기 어려운 버그를 유발할 수 있으므로 의도적으로이 동작을 피할 수 있습니다. 예외를 발생시킴으로써 프로그래머는 dict.get(), getattr() 등으로 명시 적으로 디폴트 값을 요구하거나 조회가 실패한 경우를 처리해야한다. 프로그램에서 오류가 발생한 위치에서 프로그램이 정확하게 중단됩니다.

Objective C (디버깅하기가 좋지 않은 PHP와 마찬가지로)의 경우 변수가 잘못 설정되었다는 것을 알기 전에 오랜 시간 동안 프로그램이 계속 될 수 있습니다. 일반적으로 오류가 발생한 이후로 길어질수록 원인 찾기가 어려워집니다. 이것은 불편합니다.

+0

일반적인 경우 숨기기 오류가 바람직하지 않습니다. 그러나이 특별한 경우에 의도 된 동작은 정확하게 속성 또는 '없음'을 검색하는 것입니다. 이 목적을 위해 명시 적으로 사용되는 구문 또는 바로 가기를 사용하면 해를 끼치는 것보다 훨씬 효과적입니다. – Tony

+0

동의; 그건 정확히 getattr()과 dict.get()이 제공하는 것입니다. – Luke