웹사이트 검색

5가지 파이썬 오류 설명 (그리고 수정하는 방법)


파이썬에는 여러 가지 유형의 오류가 있습니다. 당신의 파이썬 여정에서 어디에 있든지, 아마도 이러한 오류 중 하나 이상에 직면했을 것입니다. 어떤 사람들에게는 코드에서 무엇이 잘못되었는지 아는 것이 쉬울 수 있습니다. 하지만 다른 사람들에게는? 그렇지 않을 수 있습니다. 그래서 제가 그 의미를 설명하고 있습니다.

5. 들여쓰기 오류

파이썬에 완전 초보이거나 C/C++ 또는 자바와 같은 언어에서 넘어왔다면, 이것이 가장 흔히 접하게 될 오류입니다. 파이썬에서는 많은 다른 언어에서 일반적으로 사용되는 중괄호 대신 들여쓰기를 사용하여 블록을 정의합니다. "블록"은 단일 단위로 처리되는 코드의 한 부분을 의미합니다. 조건 블록, 함수 또는 루프를 생각해 보세요.

파이썬에서는 블록 내의 모든 문장이 같은 수준의 들여쓰기를 가져야 합니다. 들여쓰기 수준이 변경될 때(증가하거나 감소할 때)는 블록의 시작 또는 끝을 나타냅니다. 파이썬은 일관된 들여쓰기에 크게 의존합니다. 일관되지 않은 들여쓰기는 IndentationError를 초래합니다.

이 오류를 겪는 일반적인 상황은 코드를 편집기에 복사하여 붙여넣을 때입니다. 때때로, 서로 다른 편집기가 텍스트를 형식화하는 방식의 차이로 인해, 들여쓰기가 한 편집기에서 다른 편집기로 옮길 때 깨질 수 있습니다.

for i in range(5):
print(i)

    

위의 코드 줄을 복사하는 동안 들여쓰기가 깨졌습니다. 이 코드를 실행하면 IndentationError가 발생합니다. 이를 해결하려면 블록 아래의 문장들을 일관되게 들여쓰기를 해야 합니다.

for i in range(5):
    print(i)

    

이 오류와 관련하여 직면할 수 있는 또 다른 문제는 탭과 공백을 사용하는 것입니다. 일부 편집기는 탭을 사용하고 다른 편집기는 들여쓰기를 위해 네 개의 공백을 사용합니다. 코드에서 이것들을 혼합하면 오류가 발생합니다. 이것은 어떤 줄에 탭이 있고 어떤 줄에 공백이 있는지 육안으로 확인하기 어려워 더욱 혼란스러울 수 있습니다.

4. 구문 오류

모든 프로그래밍 언어는 구문(syntax)을 가지고 있습니다. 다시 말해, 해당 언어로 코드를 작성하기 위해 따라야 할 규칙의 집합입니다. 따라서 이러한 규칙 중 하나라도 어기면, 언어는 당신이 무엇을 하려고 하는지 알 수 없으며 구문 오류를 발생시킵니다.

파이썬에서는 SyntaxError가 해석기가 파이썬 언어의 규칙에 맞지 않는 코드를 발견했을 때 발생합니다. 이는 코드가 파이썬이 이해하거나 실행할 수 없는 방식으로 구성되었음을 의미합니다. SyntaxError는 프로그램의 시작조차 방해합니다. 파이썬에서 자주 접하게 되는 문법 오류는 다음과 같습니다:

  • 구문을 시작할 때 콜론(:)을 잊어버리는 것과 같은 구문, 반복문 또는 함수와 같은 코드 블록에서 문자가 빠진 경우.
  • 파이썬 키워드를 잘못 쓰거나 잘못 배치하는 것 (예: else 대신 esle를 쓰거나, 사용하지 말아야 할 위치에 break 문을 사용하는 경우.)
  • 예약어를 변수 이름으로 사용하는 것.
  • 연산자를 잘못 사용하기 (문장에서 같음 연산자(==)를 사용해야 할 곳에 대입 연산자(=)를 사용하는 것.)
  • 괄호를 끝내거나 따옴표를 마치는 것을 잊는 것. 이것은 종종 여러 표현을 다룰 때 발생하며, 이들이 중첩 괄호 안에 있을 때 더 자주 발생합니다.

좋은 소식은 파이썬 인터프리터가 당신이 저지른 문법 오류의 유형을 정확히 찾아내고, 오류가 발생한 줄 번호와 대략적인 위치까지 지적할 수 있다는 것입니다. 물론 때때로 오류 메시지가 다소 모호하고 정확한 원인을 반영하지 않을 수 있습니다. 만약 좋은 코드 편집기나 IDE를 사용하고 있다면, 오류와 가능한 수정 사항을 제안할 수 있습니다.

3. 인덱스 오류

파이썬은 리스트, 튜플 및 집합과 같은 여러 내장 데이터 구조를 제공합니다. 우리는 종종 이러한 데이터 구조를 반복하고 요소에 접근해야 합니다. 모든 데이터 구조에는 인덱스라고 하는 것이 포함되어 있으며, 이는 그 구조에서 특정 요소의 위치를 나타냅니다.

numbers = [1, 2, 3]
    

여기 우리는 numbers라는 목록이 있습니다. 목록의 요소에 접근하는 방법은 인덱스를 통해서입니다, 이렇게:

print(numbers[1]) # prints 2
    

IndexError는 데이터 구조(순서열이라고도 함)에서 유효한 인덱스 범위를 벗어난 인덱스에 있는 요소에 접근하려고 할 때 일반적으로 발생합니다. Python을 포함한 많은 프로그래밍 언어에서 인덱스는 0부터 시작합니다. 따라서, 시퀀스가 N개의 요소를 포함하고 있다면, 인덱스의 범위는 0부터 N-1까지입니다.

종종 프로그래머들은 이 0 기반 인덱스 사례를 처리하는 것을 잊고 1 오프 오류에 빠져 인덱스 오류를 발생시킵니다. 인덱스 오류를 피하려면 항상 시퀀스의 길이를 측정하세요.

if index < len(my_list):
    # execute code

    

시퀀스를 반복할 때, 많은 프로그래머들이 저지르는 일반적인 파이썬 실수 중 하나는 그것을 수정하는 것입니다. 이것은 또한 인덱스 오류를 일으킵니다. 그러므로 그런 행동은 피하세요.

2. 값 오류

Python은 많은 데이터 유형을 제공합니다. 다양한 데이터 유형으로 작업할 때, 우리는 다른 리터럴 값들을 다루어야 합니다. 때때로 우리는 그것들을 함수 인수로 사용합니다. 우리가 알아야 할 것은 모든 함수가 인수로 기대되는 데이터 유형이 있다는 것입니다. 그 데이터를 받으면 함수는 또한 수신한 값이 유효한지 확인합니다.

이것은 파이썬에서 ValueError를 발생시킵니다. 이는 함수나 작업이 올바른 데이터 유형을 가진 인수를 받지만 부적절한 값을 받을 때 발생하는 내장 예외입니다. 이는 인수의 유형은 허용되지만 특정 값이 수행되고 있는 작업에 대해 유효하지 않다는 것을 의미합니다.

이것의 꽤 일반적인 경우는 하나의 데이터 유형을 다른 데이터 유형으로 변환하고 싶을 때입니다.

int('10')
    

이것은 문자열 '10'을 정수 10으로 변환합니다. 하지만, 만약 당신이 이렇게 한다면:

int('ten')
    

값 오류가 발생합니다. 그 이유는 int() 함수가 문자열 데이터 유형 인수를 기대하기 때문입니다. 그러나 해당 문자열 값은 숫자로 구성되어야 합니다. 그래서 'ten'은 허용할 수 없는 값입니다. 마찬가지로 수학적 연산을 할 때도 이 오류가 발생할 수 있습니다.

import math
math.sqrt(-5)

    

sqrt() 함수는 양수를 기대합니다. 따라서 음수를 인수로 제공하면 값 오류가 발생합니다. 값 오류에 직면하는 또 다른 일반적인 시나리오는 사용자 입력을 받을 때입니다. 사용자가 입력할 수 있는 내용을 제어할 수 없기 때문에 잘못된 값을 입력하면 오류가 발생합니다.

가장 좋은 방법은 ValueError를 처리하는 것이 try-except 블록을 사용하는 것입니다.

try:
    num = input("Enter a number: ")
    num_int = int(num)
except ValueError as e:
    print(f"Caught a ValueError: {e}")
    

이렇게 하면 사용자가 잘못된 값을 입력하더라도 프로그램 크래시를 방지할 수 있습니다.

1. 속성 오류

AttributeError는 특정 객체에 존재하지 않는 속성이나 메서드에 접근하려고 할 때 발생하는 Python에서의 일반적인 예외입니다. 간단히 말해, 이는 객체에게 설계되지 않은 작업을 요청하는 것을 의미합니다.

문자열, 리스트 또는 사용자 정의 클래스와 작업할 때, 특히 서로 다른 데이터 유형 간에 전환할 때 객체가 특정 속성이나 기능을 가지고 있다고 쉽게 가정할 수 있습니다. 하지만, Python은 사용 가능한 속성을 호출하려고 시도하는 순간 AttributeError를 발생시킵니다.

text = "hello world"
print(text.push())
    

문자열에는 push() 메서드가 없습니다. 따라서 위의 예제에서 속성 오류가 발생합니다. 또 다른 예는 다음과 같습니다:

user = None
print(user.name)

    

'NoneType' 객체에서 'name' 속성에 접근하려고 하면 동일한 오류가 발생합니다. 이러한 경우 모두, 작업 중인 객체는 접근하려는 속성을 지원하지 않습니다. 이 오류가 프로그램을 방해하지 않도록 하려면 객체 유형을 확인하는 것을 고려하세요.

type(obj) # or
isinstance()

    

내장된 dir() 함수는 객체에서 사용 가능한 모든 유효한 속성과 메소드를 보여줍니다. 객체에서 이를 사용하면 어떤 속성을 사용할 수 있는지 알 수 있습니다.


파이썬은 쉬운 언어이기 때문에 언어의 기본을 배우는 것이 상당히 쉽습니다. 이제 몇 가지 일반적인 오류에 대해 알게 되었으니, 이를 디버깅하고 걱정 없이 더 파이썬다운 코드를 작성할 수 있을 것입니다.