이런 에러에 대해 질문을 하는 걸 자주 봐서 포스팅을 하나 만들어 놓습니다.
에러메시지를 해석해 보면, "'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 을 반환하여 문제가 발생하는 경우가 많았습니다.
----
- https://daewonyoon.tistory.com/368 : 'NoneType' object is not subscriptable 유사한 에러에 대한 설명.
'프로그래밍 > Python' 카테고리의 다른 글
Q-Pochhammer (0) | 2022.04.08 |
---|---|
0과 1 사이에서 랜덤하게 뽑은 숫자를 평균적으로 몇 번 더해야 1보다 커질까요? (0) | 2022.03.18 |
find (a, b) such that am + bn = gcd(m, n) (0) | 2022.01.24 |
[PYTHON|SO번역] pip search 실행시에 XMLRPC API is currently disabled due to unmanageable load 에러 발생 (0) | 2021.11.11 |
ipython : Exception [WinError 995] 스레드 종료 또는 응용 프로그램 요청 때문에 I/O 작업이 취소되었습니다 (0) | 2021.10.20 |