python - empty - 파이썬 문자열 none




파이썬에서 null 객체? (4)

None , 파이썬의 null?

파이썬에는 null 이 없으며 대신 None 있습니다. 이미 언급 한 것처럼 가장 정확한 방법은 무언가가 주어 졌는지 테스트하는 것입니다. 값으로 None 은 두 변수가 동일한 객체를 참조하는지 검사하는 is identity 연산자를 사용하는 것 is .

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

기본 사항

하나만있을 수 있으며 하나만있을 수 있음

NoneNoneType 클래스의 유일한 인스턴스이며 해당 클래스를 인스턴스화 할 때 이후의 시도는 동일한 객체를 반환하므로 None 을 싱글 톤으로 만듭니다. Python을 처음 NoneType 사람들은 NoneType 을 언급하고 그것이 무엇인지 궁금해하는 오류 메시지를 자주 보게됩니다. 이 메시지는 이름으로 None 것도 언급 할 수 없다는 개인적인 견해입니다. 곧 보게 되겠지만, None 모호한 부분을 남기지 않기 때문입니다. 따라서 NoneType TypeError 메시지가 나타나면 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

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 자체 외에도 빈 목록, 튜플, 집합, 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 은 파이썬에서 특별한 상태를 가진다. 많은 알고리즘이이 값을 예외적 인 값으로 취급하기 때문에이 값은 기본 값입니다. 이러한 시나리오에서는 조건에 특별한 처리 (예 : 기본값 설정)가 필요하다는 신호를 보내는 플래그로 사용할 수 있습니다.

함수의 키워드 인수에 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 첨자 표기법을 사용하여 액세스하려고하면 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 설정된 경우에는 알 수 None . 이러한 정보가 필요하다면 이것을 처리하는 일반적인 방법은 try/except 구조 내에서 속성 또는 키에 직접 액세스하는 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"')

유효한 값으로 만 사용 된 것은 None

코드가 위의 try/except 패턴으로 흩어져있어 None 플래그와 None 데이터를 구별하면 다른 테스트 값을 사용하십시오. 유효한 값 집합을 벗어나는 값이 데이터 구조의 데이터의 일부로 삽입되고 특수 조건 (예 : 경계, 상태 등)을 제어하고 테스트하는 데 사용되는 패턴이 있습니다. 그런 가치는 센티넬 (sentinel )이라고 불리며 None 신호로 사용 None 방식으로 사용될 수 있습니다. 파이썬에서 센티넬을 만드는 것은 간단합니다.

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

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은 키워드를 보호하지 않습니다. 위에서 undefined 정의는 정의 된 모듈의 어느 위치에서든지 언제든지 덮어 쓸 수 있으므로 노출 및 사용 방법에주의하십시오. 다음으로, object() 의해 반환 된 인스턴스는 싱글 톤이 아닙니다. 호출을 10 번하면 10 개의 다른 객체를 얻습니다. 마지막으로, 센티넬의 사용은 매우 특이합니다. 센티널은 사용 된 라이브러리에 따라 다르므로 해당 범위는 일반적으로 라이브러리의 내부로 제한되어야합니다. 그것은 "새어 나가지"않습니다. 외부 코드는 라이브러리의 API를 확장하거나 보완하는 것이 목적 인 경우에만이를 인식해야합니다.

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


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

if not foo:

파이썬에서는 값이 없다는 것을 나타 내기 위해 객체에는 None 값 ( types.NoneType.None )을 사용하고 문자열에는 "" (또는 len () == 0 )을 사용할 수 있습니다. 따라서:

if yourObject is None:  # if yourObject == None:
    ...

if yourString == "":  # if yourString.len() == 0:
    ...

"=="와 "is"의 차이점에 대해서는 "=="를 사용하여 객체 동일성을 테스트하는 것으로 충분합니다. 그러나 "is"연산은 객체 동일성 연산으로 정의되기 때문에 "=="보다는 "is"를 사용하는 것이 더 정확합니다. 속도 차이가 있는지 확실하지 않습니다.

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


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

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

if foo is None:
    ...




null