etc./StackOverFlow

파이썬에서 null 객체 참조하기

청렴결백한 만능 재주꾼 2023. 4. 15. 23:22
반응형

질문자 :Lizard


파이썬에서 null 객체를 어떻게 참조합니까?



파이썬에서 'null' 객체는 싱글톤 None 입니다.

"없음"을 확인하는 가장 좋은 방법은 ID 연산자를 사용하는 것 is .

 if foo is None: ...

Ben James

None , 파이썬의 null?

파이썬 null 이 없습니다. 대신 None 있습니다. None 이 지정되었는지 테스트하는 가장 정확한 방법은 두 변수가 동일한 객체를 참조하는지 테스트하는 is identity 연산자를 사용하는 것입니다.

 >>> foo is None True >>> foo = 'bar' >>> foo is None False

기본

하나가 있고 하나만 있을 수 있음 None

None NoneType 클래스의 유일한 인스턴스이며 해당 클래스를 인스턴스화하려는 추가 시도는 동일한 객체를 반환하여 None 을 싱글톤으로 만듭니다. NoneType 사람들은 종종 NoneType을 언급하고 그것이 무엇인지 궁금해하는 오류 메시지를 봅니다. 그것은 이러한 메시지는 단순히 말할 수 없다고 내 개인적인 의견입니다 None 우리가 곧 보 겠지만, 때문에 이름을 None 모호성에 작은 공간을 단풍. 따라서 NoneType 이 이 작업을 수행할 수 없거나 수행할 수 없다는 TypeError 메시지가 표시되면 None 이 할 수 없는 방식으로 사용되고 있다는 것을 알아두십시오.

또한 None 은 내장 상수입니다. Python을 시작하자마자 모듈, 클래스, 함수 등 어디에서나 사용할 수 있습니다. NoneType 은 그렇지 않습니다. 먼저 해당 클래스에 대해 None 을 쿼리하여 참조를 얻어야 합니다.

 >>> NoneType NameError: name 'NoneType' is not defined >>> type(None) NoneType

Python의 ID 함수 id() None 의 고유성을 확인할 수 있습니다. 개체에 할당된 고유 번호를 반환하며 각 개체에는 하나씩 있습니다. 두 변수의 id가 같으면 실제로 같은 객체를 가리킵니다.

 >>> NoneType = type(None) >>> id(None) 10748000 >>> my_none = NoneType() >>> id(my_none) 10748000 >>> another_none = NoneType() >>> id(another_none) 10748000 >>> def function_that_does_nothing(): pass >>> return_value = function_that_does_nothing() >>> id(return_value) 10748000

덮어쓸 수 None

훨씬 이전 버전의 Python(2.4 이전)에서는 None 을 재할당할 수 있었지만 더 이상은 불가능했습니다. 클래스 속성이나 함수의 범위에서도 마찬가지입니다.

 # In Python 2.7 >>> class SomeClass(object): ... def my_fnc(self): ... self.None = 'foo' SyntaxError: cannot assign to None >>> def my_fnc(): None = 'foo' SyntaxError: cannot assign to None # In Python 3.5 >>> class SomeClass: ... def my_fnc(self): ... self.None = 'foo' SyntaxError: invalid syntax >>> def my_fnc(): None = 'foo' SyntaxError: cannot assign to keyword

None 참조가 동일하다고 가정하는 것이 안전합니다. "사용자 지정" None .

None 을 테스트하려면 is 연산자를 사용하십시오.

코드를 작성할 때 다음 과 같이 Noneness를 테스트하고 싶을 수 있습니다.

 if value==None: pass

또는 이와 같은 거짓을 테스트하기 위해

 if not value: pass

의미를 이해해야 하며 왜 명시적으로 표현하는 것이 좋은지 이해해야 합니다.

사례 1: 값이 None

왜 이렇게

 value is None

보다는

 value==None

?

첫 번째는 다음과 같습니다.

 id(value)==id(None)

반면에 value==None 표현식은 실제로 다음과 같이 적용됩니다.

 value.__eq__(None)

값이 실제로 None 이면 예상한 대로 얻을 수 있습니다.

 >>> nothing = function_that_does_nothing() >>> nothing.__eq__(None) True

대부분의 경우 결과는 동일하지만 __eq__() 메서드는 특정 동작을 제공하기 위해 클래스에서 재정의될 수 있기 때문에 정확성 보장을 무효화하는 문을 엽니다.

이 수업을 고려하십시오.

 >>> class Empty(object): ... def __eq__(self, other): ... return not other

따라서 None 시도하면 작동합니다.

 >>> empty = Empty() >>> empty==None True

그러나 빈 문자열에서도 작동합니다.

 >>> empty=='' True

그리고 아직

 >>> ''==None False >>> empty is None False

사례 2: None 을 부울로 사용

다음 두 가지 테스트

 if value: # Do something if not value: # Do something

실제로 다음과 같이 평가됩니다.

 if bool(value): # Do something if not bool(value): # Do something

None 은 "거짓"입니다. 즉, 부울로 캐스팅하면 False not 연산자를 적용하면 True 를 반환합니다. None 고유한 속성이 아닙니다. False 자체 외에도 속성은 빈 목록, 튜플, 집합, 사전, 문자열 및 0과 False __bool__() 매직 메서드를 구현하는 클래스의 모든 객체에서 공유됩니다.

 >>> bool(None) False >>> not None True >>> bool([]) False >>> not [] True >>> class MyFalsey(object): ... def __bool__(self): ... return False >>> f = MyFalsey() >>> bool(f) False >>> not f True

따라서 다음과 같은 방식으로 변수를 테스트할 때 테스트에 포함하거나 제외하는 항목을 추가로 주의하십시오.

 def some_function(value=None): if not value: value = init_value()

위에서 값이 구체적으로 None init_value() 를 호출한다는 의미였습니까? 아니면 값이 0 설정되었는지, 빈 문자열이나 빈 목록도 초기화를 트리거해야 한다는 의미였습니까? 내가 말했듯이, 명심하십시오. 종종 그렇듯이, 파이썬에서는 명시적(explicit)이 암시적(implicit)보다 낫습니다 .

실제로 None

신호 값으로 사용 None

None 은 파이썬에서 특별한 지위를 가지고 있습니다. 많은 알고리즘이 이를 예외적인 값으로 취급하기 때문에 선호하는 기준 값입니다. 이러한 시나리오에서는 조건에 몇 가지 특별한 처리(예: 기본값 설정)가 필요하다는 신호를 보내는 플래그로 사용할 수 있습니다.

None 을 할당한 다음 명시적으로 테스트할 수 있습니다.

 def my_function(value, param=None): if param is None: # Do something outrageous!

객체의 속성을 얻으려고 할 때 기본값으로 반환한 다음 특별한 작업을 수행하기 전에 명시적으로 테스트할 수 있습니다.

 value = getattr(some_obj, 'some_attribute', None) if value is None: # do something spectacular!

기본적으로 사전의 get() 메서드는 존재하지 않는 키에 액세스하려고 할 때 None

 >>> some_dict = {} >>> value = some_dict.get('foo') >>> value is None True

아래 첨자 표기법을 사용하여 액세스하려고 하면 KeyError 가 발생합니다.

 >>> value = some_dict['foo'] KeyError: 'foo'

마찬가지로 존재하지 않는 항목을 팝업하려고하면

 >>> value = some_dict.pop('foo') KeyError: 'foo'

None 으로 설정되는 기본값으로 억제할 수 있습니다.

 value = some_dict.pop('foo', None) if value is None: # Booom!

플래그와 유효한 값으로 사용 None

위에서 설명한 None 사용은 유효한 값으로 간주되지 않지만 특별한 무언가를 하라는 신호와 같은 경우에 적용됩니다. 그러나 신호로 사용되더라도 데이터의 일부일 수도 있기 때문에 None 이 어디에서 왔는지 아는 것이 때때로 중요한 상황이 있습니다.

당신과의 속성에 대한 객체를 조회 할 때 getattr(some_obj, 'attribute_name', None) 백 점점 없습니다 None 액세스하려는 된 속성이로 설정된 경우를 말하지 않는다 None 또는 객체에서 모두 결석합니다. some_dict.get('some_key') 와 같이 사전에서 키에 액세스할 때와 같은 상황에서 some_dict['some_key'] None 설정되었는지 알 수 없습니다. 해당 정보가 필요한 경우 이를 처리하는 일반적인 방법은 try/except 구조 내에서 속성 또는 키에 직접 액세스를 시도하는 것입니다.

 try: # Equivalent to getattr() without specifying a default # value = getattr(some_obj, 'some_attribute') value = some_obj.some_attribute # Now you handle `None` the data here if value is None: # Do something here because the attribute was set to None except AttributeError: # We're now handling the exceptional situation from here. # We could assign None as a default value if required. value = None # In addition, since we now know that some_obj doesn't have the # attribute 'some_attribute' we could do something about that. log_something(some_obj)

마찬가지로 dict:

 try: value = some_dict['some_key'] if value is None: # Do something here because 'some_key' is set to None except KeyError: # Set a default value = None # And do something because 'some_key' was missing # from the dict. log_something(some_dict)

위의 두 가지 예는 개체 및 사전 사례를 처리하는 방법을 보여줍니다. 기능은 어떻습니까? 동일하지만 이를 위해 이중 별표 키워드 인수를 사용합니다.

 def my_function(**kwargs): try: value = kwargs['some_key'] if value is None: # Do something because 'some_key' is explicitly # set to None except KeyError: # We assign the default value = None # And since it's not coming from the caller. log_something('did not receive "some_key"')

None 유효한 값으로만 사용됨

None 플래그와 None 데이터를 구별하기 위해 try/except 패턴이 코드에 산재해 있는 경우 다른 테스트 값을 사용하세요. 유효한 값 집합을 벗어나는 값이 데이터 구조에서 데이터의 일부로 삽입되고 특수 조건(예: 경계, 상태 등)을 제어하고 테스트하는 데 사용되는 패턴이 있습니다. 이러한 값을 센티넬 None 이 신호로 사용되는 방식으로 사용할 수 있습니다. Python에서 센티넬을 만드는 것은 간단합니다.

 undefined = object()

위의 undefined 개체는 고유하고 프로그램에 관심을 가질 만한 많은 작업을 수행하지 않으므로 플래그로 None 몇 가지 주의 사항이 적용되며 이에 대한 자세한 내용은 코드 이후에 있습니다.

기능부

 def my_function(value, param1=undefined, param2=undefined): if param1 is undefined: # We know nothing was passed to it, not even None log_something('param1 was missing') param1 = None if param2 is undefined: # We got nothing here either log_something('param2 was missing') param2 = None

딕셔너리 포함

 value = some_dict.get('some_key', undefined) if value is None: log_something("'some_key' was set to None") if value is undefined: # We know that the dict didn't have 'some_key' log_something("'some_key' was not set at all") value = None

물건으로

 value = getattr(obj, 'some_attribute', undefined) if value is None: log_something("'obj.some_attribute' was set to None") if value is undefined: # We know that there's no obj.some_attribute log_something("no 'some_attribute' set on obj") value = None

앞서 언급했듯이 맞춤형 센티넬에는 몇 가지 주의 사항이 있습니다. None 과 같은 키워드가 아니므로 Python은 이를 보호하지 않습니다. undefined 것을 정의된 모듈의 어느 곳에서나 언제든지 덮어쓸 수 있으므로 노출하고 사용하는 방법에 주의하십시오. object() 의해 반환된 인스턴스는 싱글톤이 아닙니다. 10번 호출하면 10개의 다른 개체를 얻습니다. 마지막으로 센티넬의 사용법은 매우 독특합니다. 센티넬은 사용되는 라이브러리에 따라 다르므로 범위는 일반적으로 라이브러리의 내부로 제한되어야 합니다. "누출"되어서는 안됩니다. 외부 코드는 목적이 라이브러리의 API를 확장하거나 보완하는 경우에만 이를 인식해야 합니다.


Michael Ekoka

다른 언어에서와 같이 null 이라고 하지 않지만 None 입니다. 이 객체의 인스턴스는 항상 하나뿐이므로 원하는 경우 x == None x is None (동일성 비교)을 사용하여 동등성을 확인할 수 있습니다.


AndiDog

파이썬에서 값의 부재를 나타내기 위해 객체에 None 값( types.NoneType.None )을 사용하고 문자열에 "" (또는 len() == 0 )를 사용할 수 있습니다. 그러므로:

 if yourObject is None: # if yourObject == None: ... if yourString == "": # if yourString.len() == 0: ...

"=="와 "is"의 차이와 관련하여 "=="를 사용하여 개체 ID를 테스트하는 것으로 충분해야 합니다. 그러나 "is" 연산은 객체 식별 연산으로 정의되어 있으므로 "=="보다 사용하는 것이 더 정확할 것입니다. 속도 차이가 있는지조차 확실하지 않습니다.

어쨌든 다음을 볼 수 있습니다.


Paolo Rovelli

이 문제를 해결 f 문자열을 사용하십시오.

 year=None year_val= 'null' if year is None else str(year) print(f'{year_val}') null

s_mj

위의 답변은 None True float('nan') 과 같은 것이 있습니다. isnull 사용할 수 있습니다.

 >>> import pandas as pd >>> pd.isnull(None) True >>> pd.isnull(float('nan')) True >>> pd.isnull('abc') False >>>

또는 pandas 없이 :

 >>> a = float('nan') >>> (a != a) or (a == None) True >>> a = None >>> (a != a) or (a == None) True >>>

이것이 작동하는 이유는 float('nan') != float('nan') .

 >>> float('nan') == float('nan') False >>> float('nan') != float('nan') True >>>

U12-Forward

Null은 다음과 같은 특수 객체 유형입니다.

 >>>type(None) <class 'NoneType'>

객체가 'NoneType' 클래스에 있는지 확인할 수 있습니다.

 >>>variable = None >>>variable is None True

자세한 내용은 Python 문서 에서 확인할 수 있습니다.


user13235427

True 값 테스트에 따라 'None'은 FALSE로 직접 테스트하므로 가장 간단한 표현으로 충분합니다.

 if not foo:

artejera

출처 : http:www.stackoverflow.com/questions/3289601/referring-to-the-null-object-in-python

반응형