2014-09-18 1 views
3

None (이전에 문자열 요소였던 변수)을 is과 비교하고 싶지만 실패합니다.lxml '없음'유형이 없습니다.

이 변수를 None==으로 비교하면 작동합니다.

if xml.a == '': 
    xml.a = None 
: 내가 기본 인자 (즉, def f(x=None))로 None을 사용하는 일부 라이브러리, 나는 이번처럼 내 nullstrings을 변환하기 때문에

print type(xml.a) -> <type 'lxml.objectify.StringElement'> 

:

내가 이야기하고있는 변수입니다

print type(xml.a) -> <type 'lxml.objectify.NoneElement'> 

W :

나중에 타입으로 변경된 HICH가 동일하지 않습니다 :

print type(None) -> <type 'NoneType'> 

내가 설명 내가이 값을 비교할 때, 나는 다음과 같은 결과를 얻을 수 위 :

if xml.a is None: 
    print 'what I expect' 
else: 
    print 'what I do NOT expect' # sadly this one is printed 

if xml.a == None: 
    print 'what I do NOT expect' # this one is printed again... 
else: 
    print 'what I expect' 

내가 이미 알고를 그 같은 인스턴스가 아닌 개체를 비교했을 때, isfalse을 반환합니다. 하지만 제 생각에 을 None 인스턴스보다 먼저 설정 했었습니다. 반면에 그들은 그들 타입과 일치하지 않으며 isfalse을 반환하므로 None과 같은 인스턴스가 될 수 없습니다.

  • 왜?
  • ==을 사용하는 것 외에 다른 선택의 여지가 있습니까? 그것은 here에 대한 논의가 있었다 isisinstance의 차이에 대한 자세한 내용을 알고 싶은 분들을 위해

.

+0

를? – martineau

+0

'xml.a = None' 이후. – WaltheRed

+0

대체 접근법은 특별히 None에 대한 테스트를 중단하고'xml.a '와 같은 "거짓 데이터"를 찾습니다. – tdelaney

답변

9

lxml.objectify API을 사용하고 있습니다. 이 API는 특수 오브젝트을 사용하여 오브젝트화된 XML 트리에서 None 값을 나타냅니다. Nonexml.a으로 지정하면 lxml이 해당 특수 개체를 저장하므로 XML 문서의 XML 요소로 변환 할 수 있습니다.

당신이 가지고있는 것은 이 아니라None 싱글 톤입니다. 대신 lxml.objectify.NoneElement class의 인스턴스가 있습니다.

대신 그 요소의 유형을 테스트 할 수 있습니다 : '<유형'lxml.objectify.NoneElement '>``로 변경`유형 (xml.a) 무엇 후

from lxml.objectify import NoneElement 

if isinstance(xml.a, NoneElement): 
+0

감사합니다! 이것은 많은 도움이되었습니다! – WaltheRed

+0

Martijn : 그래서'lxml.objectify' API는'None'이라는 이름을 다른 것으로 다시 바인딩합니다. 파이썬 쉘에서 그런 것을 시도 할 때'SyntaxError : None to assign None'을 얻을 수 있습니까? – martineau

+1

@martineau : no,'lxml.objectify' 트리의 속성에 할당하면 방금 지정한 값에 따라 특정'objectify' 유형의 객체가 설정됩니다. 그런 속성에'None'을 대입하는 것은'__setattr__' 호출에서 처리되고'lxml.objectify.NoneElement'로 저장됩니다. 'None' 자체는 어디서나 반등하지 않는다. –