Python Language
커먼 웰스 예외
수색…
소개
스택 오버플로 (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 : 예기치 않은 들여 쓰기
들여 쓰기 수준이 아무런 이유없이 증가하는 경우이 예외가 발생합니다.
예
여기에 레벨을 올릴 이유가 없습니다.
print "This line is ok"
print "This line isn't ok"
print("This line is ok")
print("This line isn't ok")
여기에는 두 가지 오류가 있습니다. 첫 번째 오류와 들여 쓰기가 들여 쓰기 수준과 일치하지 않습니다. 그러나 단 하나가 표시됩니다 :
print "This line is ok"
print "This line isn't ok"
print("This line is ok")
print("This line isn't ok")
IndentationError / SyntaxError : 들여 쓰기가 바깥 쪽 들여 쓰기 레벨과 일치하지 않습니다.
당신이 완전히 들러 붙지 않았던 것처럼 보입니다.
예
def foo():
print "This should be part of foo()"
print "ERROR!"
print "This is not a part of foo()"
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
은 권장하지 않습니다.
- 들여 쓰기에 4 칸 을 사용하도록 편집기를 설정하십시오.
- 검색 및 바꾸기를 통해 모든 탭을 4 칸으로 바꿉니다.
- 편집기에서 탭을 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
일부 유형 (예 : int
및 string
)은 +
사용하지만 다른 경우에는 다음과 같습니다.
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
을 계산하려고했습니다. 숫자의 약수를 찾으려면 다음 예제를 참조하십시오.
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
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
를 발생시킵니다. 대신 다음과 같아야합니다.
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
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 문에 대한 주요 경고가있다.
>>> 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