반응형
모두의 파이썬 교재와 파이참으로 파이썬을 공부하다가 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 속성이 없다. 대충 이렇게 해석되어서 처음엔 왜 뜬금없이 랜덤모듈이 정수변수가 되었는지 혼란해져서 코드를 자세히 들여다보다가 원인을 알게 되었다.
다음부터는 변수 이름을 좀 더 신경써서 짓던가 모듈명을 대충 선언하지 말아야겠다. 반성하자.
반응형
'프로그래밍 > 파이썬 공부' 카테고리의 다른 글
웹 크롤링을 할 때 법적으로 주의해야 하는 사항 (0) | 2023.03.07 |
---|---|
파이썬 웹 크롤링 학습 과정 (0) | 2023.03.07 |
for문으로 중첩 리스트 만들기 (0) | 2023.03.05 |
모두의 알고리즘 - 리스트 공부 (0) | 2022.05.09 |
[파이썬 공부] Python 타자 게임 만들기와 format 함수 (0) | 2021.12.28 |