[PYTHON] 파이썬에서 null 객체?
PYTHON파이썬에서 null 객체?
파이썬에서 null 객체를 어떻게 참조 할 수 있습니까?
해결법
-
==============================
1.파이썬에서 'null'객체는 싱글 톤 없음입니다.
파이썬에서 'null'객체는 싱글 톤 없음입니다.
"Noneness"를 확인하는 가장 좋은 방법은 ID 연산자를 사용하는 것입니다.
if foo is None: ...
-
==============================
2.다른 언어에서와 같이 null이라고하지는 않지만 None은 null입니다. 이 객체의 인스턴스는 항상 단 하나이므로, 원한다면 x == None 대신 x가 None (동일성 비교) 인 동등성을 확인할 수 있습니다.
다른 언어에서와 같이 null이라고하지는 않지만 None은 null입니다. 이 객체의 인스턴스는 항상 단 하나이므로, 원한다면 x == None 대신 x가 None (동일성 비교) 인 동등성을 확인할 수 있습니다.
-
==============================
3.파이썬에는 null이 없으며 대신 None이 있습니다. 이미 언급 한 것처럼 가장 정확한 방법은 무언가가 주어 졌는지 테스트하는 것입니다. 값으로 None은 두 변수가 동일한 객체를 참조하는지 검사하는 is identity 연산자를 사용하는 것입니다.
파이썬에는 null이 없으며 대신 None이 있습니다. 이미 언급 한 것처럼 가장 정확한 방법은 무언가가 주어 졌는지 테스트하는 것입니다. 값으로 None은 두 변수가 동일한 객체를 참조하는지 검사하는 is identity 연산자를 사용하는 것입니다.
>>> foo is None True >>> foo = 'bar' >>> foo is None False
none은 NoneType 클래스의 유일한 인스턴스이며 해당 클래스를 인스턴스화 할 때 이후의 시도는 동일한 객체를 반환하므로 None을 싱글 톤으로 만듭니다. Python을 처음 접하는 사람들은 NoneType을 언급하고 그것이 무엇인지 궁금해하는 오류 메시지를 자주 보게됩니다. 이 메시지는 이름으로 아무 것도 언급 할 수 없다는 개인적인 견해입니다. 곧 보게 되겠지만, 아무도 모호한 부분을 남기지 않기 때문입니다. 따라서 TypeType 오류 메시지가 나타나면 NoneType이이 작업을 수행 할 수 없거나 수행 할 수 없다는 메시지가 표시됩니다. 단순히 사용할 수없는 방식으로 사용 된 None이라는 것을 알면됩니다.
또한, None은 내장 된 상수입니다. 파이썬을 시작하자마자 모듈, 클래스 또는 함수에 상관없이 모든 곳에서 사용할 수 있습니다. 대조적으로 NoneType은 해당 클래스에 대해 None을 쿼리하여 먼저 참조를 얻어야합니다.
>>> NoneType NameError: name 'NoneType' is not defined >>> type(None) NoneType
Python의 identity 함수 인 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
이전 버전의 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 참조가 동일하다고 가정하는 것이 안전합니다. '맞춤'없음 없음
코드 작성시 다음과 같이 Noneness를 테스트 할 유혹을받을 수 있습니다.
if value==None: pass
또는 이와 같은 거짓을 테스트하십시오.
if not value: pass
당신은 그 의미를 이해할 필요가 있으며 왜 그것이 종종 명백한 것이 좋은지 이해해야합니다.
왜 이래?
value is None
오히려
value==None
첫 번째는 다음과 같습니다.
id(value)==id(None)
표현식 값 == 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
그래서 당신은 아무도 그것을 시도하고 작동합니다.
>>> empty = Empty() >>> empty==None True
하지만 빈 문자열에서도 작동합니다.
>>> empty=='' True
그리고 아직
>>> ''==None False >>> empty is None False
다음 두 가지 테스트
if value: # do something if not value: # do something
실제로는 다음과 같이 평가된다.
if bool(value): # do something if not bool(value): # do something
None은 "거짓"입니다. 즉, 부울로 캐스트하면 False를 반환하고 not 연산자가 적용되면 True를 반환합니다. 그러나이 속성은 없음에 고유 한 속성이 아닙니다. False 자체 외에 빈 목록, 튜플, 집합, dicts, 문자열, 0은 물론 __bool __ () 매직 메서드를 구현하는 클래스의 모든 객체가 False를 반환하는 속성을 공유합니다.
>>> 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으로 설정된 값 또는 빈 문자열 또는 빈 목록이 초기화를 트리거해야한다는 의미였습니까? 내가 말한 것처럼, 염두에 두라. 그것은 종종 파이썬에서 명시 적으로 암시 적보다 낫습니다.
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의 사용은 그것이 유효한 값으로 간주되지 않을 때 적용되지만, 특별한 것을하기위한 신호와 같습니다. 그러나 신호가 신호로 사용 되더라도 데이터의 일부가 될 수 있기 때문에 아무도 어디에서 왔는지 알 필요가없는 상황이 있습니다.
getattr (some_obj, 'attribute_name', 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 hanling 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)
위의 두 예제는 객체 및 사전 사례를 처리하는 방법을 보여줍니다. 함수는 무엇입니까? 같은 일이지만, 우리는 그 목적을 위해 double asterisks 키워드를 사용합니다 :
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"')
코드가 위의 try / except 패턴으로 흩어져있어 None 플래그와 None 데이터를 구별하면 다른 테스트 값을 사용하십시오. 유효한 값 집합을 벗어나는 값이 데이터 구조의 데이터의 일부로 삽입되고 특수 조건 (예 : 경계, 상태 등)을 제어하고 테스트하는 데 사용되는 패턴이 있습니다. 그런 가치는 센티넬 (sentinel)이라고 불리며 아무도 신호로 사용되지 않는 방식으로 사용될 수 있습니다. 파이썬에서 센티넬을 만드는 것은 간단합니다.
undefined = object()
위의 정의되지 않은 개체는 고유하며 프로그램에 관심이있는 요소를 많이 수행하지 않으므로 플래그로 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
dict로
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은 키워드를 보호하지 않습니다. 위에서 정의되지 않은 정의는 정의 된 모듈의 어느 위치에서든지 언제든지 덮어 쓸 수 있으므로 노출 및 사용 방법에주의하십시오. 다음으로, object ()에 의해 반환 된 인스턴스는 싱글 톤이 아닙니다. 호출을 10 번하면 10 개의 다른 객체를 얻습니다. 마지막으로, 센티넬의 사용은 매우 특이합니다. 센티널은 사용 된 라이브러리에 따라 다르므로 해당 범위는 일반적으로 라이브러리의 내부로 제한되어야합니다. "누출"해서는 안됩니다. 외부 코드는 라이브러리의 API를 확장하거나 보완하는 것이 목적 인 경우에만이를 인식해야합니다.
-
==============================
4.파이썬에서는 값이 없다는 것을 나타 내기 위해 객체에는 None 값 (types.NoneType.None)을 사용하고 문자열에는 ""(또는 len () == 0)을 사용할 수 있습니다. 따라서:
파이썬에서는 값이 없다는 것을 나타 내기 위해 객체에는 None 값 (types.NoneType.None)을 사용하고 문자열에는 ""(또는 len () == 0)을 사용할 수 있습니다. 따라서:
if yourObject is None: # if yourObject == None: ... if yourString == "": # if yourString.len() == 0: ...
"=="와 "is"의 차이점에 대해서는 "=="를 사용하여 객체 동일성을 테스트하는 것으로 충분합니다. 그러나 "is"연산은 객체 동일성 연산으로 정의되기 때문에 "=="보다는 "is"를 사용하는 것이 더 정확합니다. 속도 차이가 있는지 확실하지 않습니다.
어쨌든, 당신은 다음을 볼 수 있습니다 :
-
==============================
5.Per Per Truth 값 테스트에서 'None'은 FALSE로 직접 테스트하므로 가장 간단한 표현으로 충분합니다.
Per Per Truth 값 테스트에서 'None'은 FALSE로 직접 테스트하므로 가장 간단한 표현으로 충분합니다.
if not foo:
from https://stackoverflow.com/questions/3289601/null-object-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서의 C와 같은 구조 (0) | 2018.10.16 |
---|---|
[PYTHON] Python`x가 None이 아닌 경우`또는`x가 None이 아닌 경우`? (0) | 2018.10.16 |
[PYTHON] 파이썬에서 최소한의 플러그인 아키텍처 구현하기 (0) | 2018.10.16 |
[PYTHON] def main ()을 사용하는 이유는 무엇입니까? [복제] (0) | 2018.10.16 |
[PYTHON] NumPy에서 배열을 정규화하는 방법? (0) | 2018.10.16 |