파이썬에서 null 객체를 어떻게 참조합니까?
질문자 :Lizard
파이썬에서 '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
'etc. > StackOverFlow' 카테고리의 다른 글
virtualenv에서 다른 Python 버전 사용 (0) | 2023.04.15 |
---|---|
Vim에서 줄을 주석 처리하거나 주석 처리를 해제하는 빠른 방법은 무엇입니까? (0) | 2023.04.15 |
HTTP POST 웹 요청을 만드는 방법 (0) | 2023.04.15 |
HTML에서 표시하기 위해 위/아래 삼각형(줄기가 없는 화살표)에 사용할 수 있는 문자는 무엇입니까? (0) | 2023.04.14 |
이미 원격 브랜치로 푸시된 병합 커밋을 되돌리는 방법은 무엇입니까? (0) | 2023.04.14 |