본문 바로가기

프로그래밍/Python

[파이썬초보] AttributeError: 'NoneType' object has no attribute

반응형

이런 에러에 대해 질문을 하는 걸 자주 봐서 포스팅을 하나 만들어 놓습니다.

에러메시지를 해석해 보면, "'NoneType' 객체는 ~~ 애트리뷰트가 없습니다."라는 뜻입니다. NoneType 객체는 사실 None 입니다. 파이썬의 None 은 자바나 C의 Null 같은 것입니다. 그래서 결국 None.someattr 이런식의 코드가 유효하지 않기 때문에 발생하는 에러입니다.

제가 만든 예제를 보고 이해해 보도록 합시다.

>>> class dummy:
	def bark(self):
		print("dum dum")

		
>>> def get_dummy(n):
	if n > 10:
		return dummy()
	return

>>> d = get_dummy(21)
>>> d.bark()
dum dum
>>> d2 = get_dummy(1)
>>> d2.bark()
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    d2.bark()
AttributeError: 'NoneType' object has no attribute 'bark'
>>>

dummy 라는 클래스를 만들었고, dummy 객체는 bark 라는 애트리뷰트가 있습니다. 그래서, d.bark() 같은 코드를 쓸 수 있습니다. get_dummy 라는 함수는 dummy 객체를 하나 가져오는 함수입니다. 객체를 이 함수로 가져와서, 객체에 대해 bark 라는 동작을 시키려는 코드가 되겠습니다.

마지막에 보면, 'NoneType' object has no attribute 'bark' 라는 에러가 발생했습니다. 이 포스팅에서 설명하려는 유형의 에러입니다. 이 에러가 발생한 것은 get_dummy(1) 가 반환한 것이 dummy 객체가 아니라, None 이기 때문에, d2 에 담긴 것은 결국 None 이 되고, None.bark() 를 시도하였으니, bark 애트리뷰트가 없다고 에러메시지로 알려주는 것이죠.

이 에러를 만나시는 분들의 코드도 이와 같이 어떤 객체변수에 대해 .어쩌고 를 시도하는 부분에서 에러가 발생했을 것입니다. 그렇다면, 문제가 발생한 객체변수가 어떻게 만들어졌는데, 어떤 함수에서 받아오는지를 살펴보셔야 합니다.

주식거래 자동화 하시는 분들의 질문을 많이 봤는데, 많은 경우 증권사등이 제공하는 api 함수(또는 그 래핑함수)가 네트워크 상황등에 따라 제대로 결과를 못 주고, None 을 반환하여 문제가 발생하는 경우가 많았습니다. 

----

728x90