프로그래밍/파이썬 공부

[파이썬 공부] AttributeError의 원인과 해결 과정

이자다 2021. 12. 27. 10:15
반응형

모두의 파이썬 교재와 파이참으로 파이썬을 공부하다가 AttributeError를 만나게 되었다.

 

AttributeError은 모듈명과 변수명을 똑같이 작성한 것이 원인이 되어 나타났다. 구글링을 해보니 나처럼 모듈 이름이랑 변수 이름을 똑같이 해버린 사례가 꽤 있었다. 모듈에서 가져올 속성의 이름이 오타가 나서 이 모듈에 이런 속성은 없다고 AttributeError가 나온 경우도 있었고.

 

나의 사례를 코드로 설명하자면 아래와 같다. 주석에 주목하자.

 

import random as r   #random 모듈을 r 이라고 사용하겠다고 선언 (문제의 원인)

def make_question():
    a=r.randint(1,40)  # 아래의 for문 블럭이 한바퀴 실행된 후 이 줄에 문제가 생긴다.
    b=r.randint(1,20)  # 첫바퀴는 잘 돌아갔지만 for문 내에서 r을 int변수로 선언해버렸다.
    op=r.randint(1,3)  # 때문에 정수변수 r에서 randint를 찾는 일이 되어버렸고 이게 에러가 되어버렸다.

    q=str(a)

    if op==1:
        q=q+"+"
    if op==2:
        q=q+"-"
    if op==3:
        q=q+"*"

    q=q+str(b)

    return q

sc1=0
sc2=0

for x in range(5):
    q=make_question()
    print(q)
    ans=input("=")
    r=int(ans)     # r을 모듈명으로 사용하겠다고 선언한 것을 잊고 r을 정수 변수로 사용.

    if eval(q)==r: # r이 랜덤모듈이 아니라 정수변수가 되어버렸다.
        print("정답")
        sc1=sc1+1

    else:
        print("오답")
        sc2=sc2+1

print("정답: ", sc1, "오답: ", sc2)
if sc2==0:
    print("당신은 천재입니다!")

 

 

오류 문구는 AttributeError("'int' object has no attribute 'randint'",) 라고 나왔다.

 

int 개체는 randint 속성이 없다. 대충 이렇게 해석되어서 처음엔 왜 뜬금없이 랜덤모듈이 정수변수가 되었는지 혼란해져서 코드를 자세히 들여다보다가 원인을 알게 되었다.

 

다음부터는 변수 이름을 좀 더 신경써서 짓던가 모듈명을 대충 선언하지 말아야겠다. 반성하자.

반응형