복붙노트

[PYTHON] 파이썬에서 null 객체?

PYTHON

파이썬에서 null 객체?

파이썬에서 null 객체를 어떻게 참조 할 수 있습니까?

해결법

  1. ==============================

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

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

    "Noneness"를 확인하는 가장 좋은 방법은 ID 연산자를 사용하는 것입니다.

    if foo is None:
        ...
    
  2. ==============================

    2.다른 언어에서와 같이 null이라고하지는 않지만 None은 null입니다. 이 객체의 인스턴스는 항상 단 하나이므로, 원한다면 x == None 대신 x가 None (동일성 비교) 인 동등성을 확인할 수 있습니다.

    다른 언어에서와 같이 null이라고하지는 않지만 None은 null입니다. 이 객체의 인스턴스는 항상 단 하나이므로, 원한다면 x == None 대신 x가 None (동일성 비교) 인 동등성을 확인할 수 있습니다.

  3. ==============================

    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. ==============================

    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. ==============================

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

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

    if not foo:
    
  6. from https://stackoverflow.com/questions/3289601/null-object-in-python by cc-by-sa and MIT license