안녕하세요 flask를 공부하다가 python문법에 의아함이 생겨 이곳에 질문글 올립니다.

 
KwangRok Ahn

안녕하세요 flask를 공부하다가 python문법에 의아함이 생겨 이곳에 질문글 올립니다.
1. with sqlite3.connect(app.config[‘DATABASE’]) as db:
2. with urllib.urlopen(domain) as page:
이 두개의 구문에서 첫번째 구문은 정상작동하지만, 두번째 구문은
Traceback (most recent call last): File “”, line 1, in
AttributeError: addinfourl instance has no attribute ‘__exit__’
이란 에러 구문을 내뱉고 작동하지않습니다. urllib.urlopen으로 반환된 객체는 fileobject던데 fileobject를 close없이 처리하기위해서 with구문을 사용하는 것이 아닌가요? 왜 두번째 구문은 에러가 나는것일까요 …?? python고수님들의 답변 기다리겠습니다 ..ㅠ_ㅠ

  • Byungjin Park

    with as 문의 경우 보통 자동으로 close 까지 해주는데, urllib 에 종료를 위한 함수가 없어서 그런게 아닐까?

    조성환

    2번째 경우 with contextlib.closing(urllib.urlopen(domain)) as page: 보통 이렇게 쓰이는것 같은데 with가 하는 역할과 closing이 하는 역할의 차이점이 무엇인지 궁금하네요

    KwangRok Ahn

    박병진 형말대로 __exit__ attribute가 없어서 그런가보네요! 근데 객체 하나하나 __exit__ attribute가 있는지 없는지 확인하고 쓰지는 않을것 같은데 그래서 with문을 쓸때 보통 closing 함수를 이용해주는 것인가요 ?

    Byungjin Park

    with as 블록이 끝날 때 사용된 Object가 소멸되어야 하는 것을 전제하는 것 같은데 contextlib.closing이 __exit__ 대신에 이거를 수행해주는 것 같다~!! 아래는 contextlib.closing설명
    >>> print contextlib.closing.__doc__
    Context to automatically close something at the end of a block.

    Code like this:

    with closing(.open()) as f:

    is equivalent to this:

    f = .open()
    try:

    finally:
    f.close()

    Whoami Jeong

    으어 어려워… ㅠㅠ 쿨럭

    Whoami Jeong

    많이 배우네요. 감사합니다 ㅋ

Advertisements