티스토리 뷰

python lecture/basic

[edu] 파이썬 시작하기 - 8

burningrizen 2018. 8. 29. 20:08

[모듈 임포트]



소스 코드를 작성하다 보면 하나의 파일에 모든 것을 담을 수 없다.


기능별로 모듈화 해서 여러 파일에 저장하게 된다.


여러파일에 있는 모듈들을 임포트해서 사용해보자!



zoo.py 에서 정의된 함수 find() 를 사용해 보자



def find():
print("find!")


다음과 같이 함수 하나를 정의했다.


이것을 root.py 에서 호출해보자



import zoo

zoo.find()


zoo 는 모듈이름(파일이름) 이고 해당 모듈에 있는 함수는

module.method 이렇게 호출하면된다.



모듈에 정의된 클래스는 어떻게 접근할까?

class Animal:
pass

zoo.py 에 클래스를 정의하고

import zoo

z = zoo.Animal()

함수와 마찬가지로 접근하면 된다.



예를 들어서 

import os

os.dir()

이렇게 os 모듈을 임포트 하였는데 

os 라는 것을 window 라고 명시적으로 표현해 주고 싶다면?

임포트한 모듈이름을 그대로 사용하지 않고 변경해야 할 경우가 있다.


import os as winos

winos.dir()

as 를 붙여서 변경하고자 하는 이름을 써주면 된다.






[오류 발생]



오류를 처리하는 방법에 대해 알아보자


일단 파일을 열어서 처리할 때 만약 해당경로에 파일이 없으면 에러가 발생한다.


FileNotFoundError: [Errno 2] No such file or directory:


어떤 수를 0으로 나눌 때도 에러가 발생한다.

ZeroDivisionError: division by zero


마지막 예로 리스트에서 인덱스에 벗어난 요소를 접근할 때도 에러가 발생한다.

IndexError: list index out of range





[try,except]


오류를 처리하는 try, except 의 기본구조를 알아보자


try:
4 / 0
except ZeroDivisionError as e:
print(e)

try 뒤에는 실행할 구문이 온다


except 뒤에는 발생 오류가 오고 


as 뒤에는 오류 메세지를 담을 변수가 위치한다.


마지막으로 print 로 오류 메세지를 출력한다.






[try .. else]


else 문은 예외가 발생하지 않았을 때 실행된고


반드시 except 문 다음에 위치해야 한다.


try:
f = open('foo.txt', 'r')
except FileNotFoundError as e:
print(str(e))
else:
data = f.read()
f.close()


except 에서 정의된 에러가 발생하지 않으면 else 문을 실행한다.


foo.txt 라는 파일이 없으면 에러가 발생하고


그렇지 않다면 else 문의 코드를 처리한다.







[try .. finally]


try문에는 finally 절이 사용될 수 있다.


finally 절은 try문 수행 도중 예외 발생 여부에 상관없이 반드시 수행된다.


리소스를 close 해야하는 경우에 많이 사용된다.


f = open('foo.txt', 'w')
try:
# 무언가를 수행한다.
finally:
f.close()


파일이 열리고 try 에서 무언가 실행된다.


파일에서 얻은 데이터로 무언가를 했을때 에러가 나더라도


반드시 파일은 닫아줘야 하기 때문에


finally 에 close 코드를 위치시켰다.







[여러개 오류처리]


try 에서 한개의 오류가 아니라 여러개의 오류가 발생할 수 있다.


try:
a = [1,2]
print(a[3])
4/0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except IndexError:
print("인덱싱 할 수 없습니다.")


0으로 나눌떄, 인덱싱 오류일때 2개의 경우를 각각


except 문 2개로 처리하였다.


여기서는 0으로 나누기 전에 인덱싱 오류가 먼저 발생하여


except IndexError  절만 실행된다.


try:
a = [1,2]
print(a[3])
4/0
except (ZeroDivisionError, IndexError) as e:
print(e)


한개의 except 절에 두개의 발생에러를 처리할 수도 있다.







[오류 회피]


경우에 따라서는 특정 오류를 그냥 통과시켜야 할 때가 있다.


try:
f = open("없는파일", 'r')
except FileNotFoundError:
pass


파일이 없을 때 오류를 발생시키고 


그때는 그냥 통과한다.


pass 는 아무것도 하지 않는다는 의미이다.








[오류 의도적으로 발생시키기]


오류가 발생하지 않도록 보통 노력하는데


의도적으로 에러를 발생시키는게 이상할 수 있다.


하지만 경우에 따라서 발생 시킬때도 있다.


class Bird:
def fly(self):
raise NotImplementedError


Bird 라는 클래스를 상속 받는 클래스가 


fly 함수를 재정의 하지 않으면 에러가 발생한다.


자식 클래스에서 반드시 fly 함수를 구현하라는 의도이다.


raise 는 명령어를 이용해 오류를 강제로 발생시킬 수 있다.



 NotImplementedError는 파이썬 내장 오류로, 꼭 작성해야 하는 부분이 구현되지 않았을 경우 일부러 오류를 발생시키고자 사용한다.


class Eagle(Bird):
pass

e = Eagle()
e.fly()


Eagle 은 Bird 를 상속 받는데


fly 를 구현하지 않고 상속 받은것을 그대로 사용한다면


에러가 발생한다.






[예외 만들기]


프로그램이 동작될때 특수한 경우에만 예외처리를 하기 위해


가끔은 예외를 만들어서 사용하게 된다.


class MyError(Exception):
pass


Exception 을 상속 받아서 새로운 예외를 만들었다.


def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)


'바보'라는 닉이 들어 왔다면 에러를 발생 시킨다.


try:
say_nick("천사")
say_nick("바보")
except MyError:
print("허용되지 않는 별명입니다.")


이렇게 에러처리를 해줄 수 있다.



except 절에서 print 문으로 하드코딩하지 말고 


에러메세지를 받아서 출력해 보자.


class MyError(Exception):
def __str__(self):
return '허용되지 않는 별명입니다.'

def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)

try:
say_nick("천사")
say_nick("바보")
except MyError as e:
print(e)



__str__ 은 클래스를 대표하는 문자열이다.


에러가 발생될때 에러메세지를 __str__ 로 전달할 수 있다.






[with as]


파일을 다룰 때는 마지막에 close 로 닫아 주어야 한다.


with 블록을 사용하면 명시적으로 close() 메서드를 호출하지 않고 파일을 닫을 수 있다.


 with 블록이 자동으로 블록을 종료할 때 __exit__() 메서드를 호출하여


파일을 close 시키게 된다.



with open('test.txt', mode='wt', encoding='utf-8') as f:
f.write('파이썬으로 파일을 작성하고 있습니다.')
f.write('newline 문자로 개행해봅니다.\n')
f.write('개행이 잘되었나요?')



with 블록, 즉 들여쓰기 안에 모든 코드가 끝나면


자동으로 close 시키게 된다.








댓글