수색…


소개

스택 오버플로 (Stack Overflow)에서는 동일한 오류에 대해 중복되는 내용을 종종 보게됩니다. "ImportError: No module named '??????' , SyntaxError: invalid syntax 되었거나 NameError: name '???' is not defined 이것은 NameError: name '???' is not defined 이를 줄이기 위해 링크 할 문서가 필요합니다.

IndentationErrors (또는 들여 쓰기 SyntaxErrors)

대부분의 다른 언어에서 들여 쓰기는 필수는 아니지만 Python (및 다른 언어 : 초기 버전의 FORTRAN, Makefiles, Whitespace (난해한 언어) 등)에서는 그렇지 않습니다. 다른 언어에서 온 경우 혼동을 줄 수 있습니다. 예제에서 코드를 자신의 것으로 복사하는 경우 또는 단순히 새로운 코드 인 경우.

IndentationError / SyntaxError : 예기치 않은 들여 쓰기

들여 쓰기 수준이 아무런 이유없이 증가하는 경우이 예외가 발생합니다.

여기에 레벨을 올릴 이유가 없습니다.

Python 2.x 2.0 2.7
 print "This line is ok"
     print "This line isn't ok"
Python 3.x 3.0
 print("This line is ok")
     print("This line isn't ok")

여기에는 두 가지 오류가 있습니다. 첫 번째 오류와 들여 쓰기가 들여 쓰기 수준과 일치하지 않습니다. 그러나 단 하나가 표시됩니다 :

Python 2.x 2.0 2.7
 print "This line is ok"
  print "This line isn't ok"
Python 3.x 3.0
 print("This line is ok")
  print("This line isn't ok")

IndentationError / SyntaxError : 들여 쓰기가 바깥 쪽 들여 쓰기 레벨과 일치하지 않습니다.

당신이 완전히 들러 붙지 않았던 것처럼 보입니다.

Python 2.x 2.0 2.7
def foo():
    print "This should be part of foo()"
   print "ERROR!"
print "This is not a part of foo()"
Python 3.x 3.0
 print("This line is ok")
  print("This line isn't ok")

IndentationError : 들여 쓰기 된 블록 예상

콜론 (그리고 새로운 라인) 후에 들여 쓰기 레벨이 증가해야합니다. 이 오류는 발생하지 않았을 때 발생합니다.

if ok:
doStuff()

참고 : if , else , except , class , method 또는 definition 넣고 호출 / 조건이 true 일 때 어떤 일이 일어날 지 말하지 않는 키워드 pass (절대적으로 아무것도하지 않음)를 사용합니다 (그러나 나중에 수행하거나 except : 아무것도하지 마라) :

def foo():
    pass

IndentationError : 들여 쓰기에서 탭과 공백의 일관성없는 사용

def foo():
    if ok:
      return "Two != Four != Tab"
        return "i dont care i do whatever i want"

이 오류를 방지하는 방법

탭을 사용하지 마십시오. Python의 스타일 가이드 인 PEP8 은 권장하지 않습니다.

  1. 들여 쓰기에 4 을 사용하도록 편집기를 설정하십시오.
  2. 검색 및 바꾸기를 통해 모든 탭을 4 칸으로 바꿉니다.
  3. 편집기에서 탭을 8 칸으로 표시 하도록 설정하면 쉽게 오류를 인식하고 고칠 수 있습니다.

자세한 내용을 보려면 질문을 참조하십시오.

TypeErrors

이러한 예외는 일부 객체의 유형이 달라야 할 때 발생합니다.

TypeError : [정의 / 메서드]가 사용됩니까? 위치 논쟁 그러나? 주어졌다

받아 들일 수있는 인수보다 더 많은 (또는 적은) 인수로 함수 또는 메소드가 호출되었습니다.

더 많은 인수가 주어진다면 :

def foo(a): return a
foo(a,b,c,d) #And a,b,c,d are defined

인수가 적다면 :

def foo(a,b,c,d): return a += b + c + d
foo(a) #And a is defined

참고 : 알 수없는 인수를 사용하려면 *args 또는 **kwargs 사용할 수 있습니다. * args 및 ** kwargs를 참조하십시오.


TypeError : [operand]에 대해 지원되지 않는 피연산자 유형 : '???' 및 '???'

피연산자에 따라 일부 유형을 함께 조작 할 수 없습니다.

예 : + 는 연결하고 추가하는 데 사용되지만 두 유형 모두에 대해 사용할 수는 없습니다. 예를 들어, 'set1''tuple1' 을 연결 ( + ing)하여 set 를 만들려고 시도하면 오류가 발생합니다. 암호:

set1, tuple1 = {1,2}, (3,4)
a = set1 + tuple1

일부 유형 (예 : intstring )은 + 사용하지만 다른 경우에는 다음과 같습니다.

b = 400 + 'foo'

아니면 아무것도 사용하지 않을 수도 있습니다.

c = ["a","b"] - [1,2]

하지만 예를 들어 int float 을 추가 할 수 있습니다.

d = 1 + 1.0

TypeError : '???' 개체는 반복 가능 / 구독 가능하지 않습니다.

반복 가능한 객체의 경우, 인덱스가 더 이상 유효하지 않고 IndexError 가 발생할 때까지 0부터 시작하는 순차 인덱스를 취할 수 있습니다 (기술적으로 __iterator__ 를 반환하는 __iter__ 메소드가 있거나 __getitem__ 메소드를 정의해야합니다). 이전에 언급 된 내용).

여기서 우리는 bar 가 1의 0 번째 항목이라는 것을 말하고 있습니다. 넌센스 :

foo = 1
bar = foo[0]

이것은 더 이산 버전이 예에서는 for 시도 설정할 x 하기 amount[0] 반복 가능에, 첫 번째 항목을하지만 량은 INT이다 수 없기 :

amount = 10
for x in amount: print(x)

TypeError : '???' 개체를 호출 할 수 없습니다.

변수를 정의하고 나중에 호출 (함수 또는 메소드로 수행하는 것과 같이)

foo = "notAFunction"
foo()

NameError : 이름 '???' 정의되지 않았습니다.

초기화되지 않은 변수, 메서드 또는 함수를 사용하려고 할 때 발생합니다 (적어도 이전에는 없었 음). 즉, 요청 된 로컬 또는 글로벌 이름을 찾을 수 없을 때 발생합니다. 물체의 이름을 잘못 입력했거나 무언가를 import 것을 잊었을 가능성이 있습니다. 어쩌면 다른 범위에있을 수도 있습니다. 별도의 예를 들어 설명해 드리겠습니다.


코드에 아무 것도 정의되어 있지 않습니다.

특히 상수 인 경우 초기화하는 것을 잊어 버린 것일 수 있습니다.

foo   # This variable is not defined
bar() # This function is not defined

어쩌면 나중에 정의 될 수 있습니다.

baz()

def baz():
    pass

또는 그것은 import 되지 않았다 :

#needs import math

def sqrt():
    x = float(input("Value: "))
    return math.sqrt(x)

파이썬 범위 및 LEGB 규칙 :

소위 LEGB 규칙은 파이썬 범위에 대해 이야기합니다. 이름은 다른 우선 순위에 따라 다른 범위를 기반으로합니다.

Local → Enclosed → Global → Built-in.
  • L ocal : 전역 변수로 선언되지 않았거나 함수에 할당되지 않은 변수입니다.
  • E nclosing : 다른 함수 안에 랩핑 된 함수에 정의 된 변수.
  • G lobal : 변수는 전역 변수로 선언되거나 파일의 최상위 레벨에 할당됩니다.
  • B uilt-in : 내장 이름 모듈에 미리 할당 된 변수입니다.

예로서:

for i in range(4):
    d = i * 2
print(d)

d 는 접근 가능합니다. 왜냐하면 for 루프는 새로운 스코프를 표시하지 않기 때문에 오류가 발생하고 그 동작은 다음과 비슷합니다 :

def noaccess():
    for i in range(4):
        d = i * 2
noaccess()
print(d)

파이썬에서 NameError: name 'd' is not defined

기타 오류

AssertError

assert 문은 거의 모든 프로그래밍 언어로 존재합니다. 할 일 :

assert condition

또는:

assert condition, message

다음과 같습니다.

if __debug__:
    if not condition: raise AssertionError(message)

어설 션에는 선택적 메시지가 포함될 수 있으며 디버깅을 마쳤 으면 어설 션을 비활성화 할 수 있습니다.

참고 : 내장 변수 디버그 는 정상적인 상황에서는 True이고, 최적화가 요청되면 False입니다 (명령 행 옵션 -O). 디버그 지정이 불법입니다. 인터프리터가 시작되면 내장 변수의 값이 결정됩니다.

KeyboardInterrupt

사용자가 인터럽트 키 (일반적으로 Ctrl + C 또는 del 키)를 누를 때 발생하는 오류입니다.

ZeroDivisionError

정의되지 않은 1/0 을 계산하려고했습니다. 숫자의 약수를 찾으려면 다음 예제를 참조하십시오.

Python 2.x 2.0 2.7
div = float(raw_input("Divisors of: "))
for x in xrange(div+1): #includes the number itself and zero
    if div/x == div//x:
        print x, "is a divisor of", div
Python 3.x 3.0
div = int(input("Divisors of: "))
for x in range(div+1): #includes the number itself and zero
    if div/x == div//x:
        print(x, "is a divisor of", div)

for 루프는 그 값을 x 할당하기 때문에 ZeroDivisionError 를 발생시킵니다. 대신 다음과 같아야합니다.

Python 2.x 2.0 2.7
div = float(raw_input("Divisors of: "))
for x in xrange(1,div+1): #includes the number itself but not zero
    if div/x == div//x:
        print x, "is a divisor of", div
Python 3.x 3.0
div = int(input("Divisors of: "))
for x in range(1,div+1): #includes the number itself but not zero
    if div/x == div//x:
        print(x, "is a divisor of", div)

좋은 코드의 구문 오류

흥미로운 라인을 가리키는 SyntaxError의 총 시간은 그 라인 앞에 문제가 있다는 것을 의미합니다 (이 예에서는 누락 된 괄호입니다).

def my_print():
    x = (1 + 1
    print(x)

보고

  File "<input>", line 3
    print(x)
        ^
SyntaxError: invalid syntax

이 문제의 가장 보편적 인 이유는 괄호 / 괄호가 맞지 않는 것입니다.

파이썬 3에는 print 문에 대한 주요 경고가있다.

Python 3.x 3.0
 >>> print "hello world"
  File "<stdin>", line 1
    print "hello world"
                      ^
SyntaxError: invalid syntax

print 문이 print() 함수로 대체 되었으므로 다음을 원합니다.

print("hello world")  # Note this is valid for both Py2 & Py3


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow