python with statement 진급 이해

이전 에는 항상 파일 을 열 고 pickle. load (file) 로 처리 해 야 하 는 항목 이 있 었 기 때문에...마지막 으로 파일 을 닫 아야 하기 때문에 좀 번 거 롭 고 코드 도 간결 하지 않 습 니 다.그래서 python with statement 에 해결 방법 을 찾 습 니 다.
 
인터넷 에서 글 한 편 을 보 았 다.http://effbot.org/zone/python-with-statement.htmwith 를 소개 하 는 것 으로 예 를 참고 하여 이 해 했 습 니 다.
 
만약 에 이런 코드 세그먼트 가 자주 있다 면 몇 가지 방법 으로 개선 할 수 있 습 니 다.
코드 세그먼트:
set thing up
try:
    do something
except :
    handle exception
finally:
    tear thing down
 
사례 1:
지금 이 기능 을 실현 하려 면 파일 을 열 고 파일 에서 데 이 터 를 읽 은 다음 터미널 로 인쇄 한 다음 파일 을 닫 는 것 입 니 다.
그러면 논리 적 으로 '터미널 로 인쇄' 를 데이터 처리 부분 으로 추출 할 수 있 고 함수 로 독립 할 수 있 을 것 이다.다른 파일 을 열 고 닫 는 것 과 같은 것 은 함께 해 야 합 니 다.
파일 이름: fortest.txt
 
방법 1:
함수 로 공공 부분 을 추출 하 다.
#!/usr/bin/env python

from __future__ import with_statement 

filename = 'for_test.txt'

def output(content):
    print content

#functio solution
def controlled_execution(func):
    #prepare thing
    f = None
    try:
        #set thing up
        f = open(filename, 'r')
        content = f.read()
        if not callable(func):
            return
        #deal with thing 
        func(content)

    except IOError, e:
        print 'Error %s' % str(e)

    finally:
        if f: 
            #tear thing down
            f.close()

def test():
    controlled_execution(output)

test()
 
방법 2:
yield 로 하나만 생 성 하 는 generator 를 실현 합 니 다.for - in 을 통 해 순환 합 니 다.
코드 세 션 은 다음 과 같 습 니 다:
#yield solution
def controlled_execution():
    f = None
    try:
        f = open(filename, 'r')
        thing = f.read()
        #for thing in f:
        yield thing
    except IOError,e:
        print 'Error %s' % str(e)
    finally:
        if f: 
            f.close()

def test2():
    for content in controlled_execution():
        output(content)

 
방법 3:
클래스 방식 에 with 실현.
코드 세 션 은 다음 과 같 습 니 다:
#class solution
class controlled_execution(object):
    def __init__(self):
        self.f = None
        
    def __enter__(self):
        try:
            f = open(filename, 'r')
            content = f.read()
            return content
        except IOError ,e:
            print 'Error %s' % str(e)
            #return None

    def __exit__(self, type, value, traceback):
        if self.f:
            print 'type:%s, value:%s, traceback:%s' % \
                    (str(type), str(value), str(traceback))
            self.f.close()

def test3():
    with controlled_execution() as thing:
        if thing:
            output(thing)

 
방법 4:
with 로 실현 하 다.exception handle 기능 은 없습니다.
def test4():
    with open(filename, 'r') as f:
        output(f.read())

    print f.read()

 마지막 print 는 f 가 닫 혔 는 지 테스트 하 는 데 사 용 됩 니 다.
 
 
 
 
    마지막 으로 요약 하면 이 글 을 쓰 는 목적 은 주로 한 마디 의 자극 을 받 은 것 이다. "언어의 좋 은 특성 을 사용 하고 나 쁜 특성 을 사용 하지 마 세 요!"python 은 정말 우아 하고 좋 은 특성 이 많 습 니 다. 길이 멀 고 멀 어서 저 는 위아래 로 찾 아 보 겠 습 니 다.

좋은 웹페이지 즐겨찾기