복붙노트

[PYTHON] Python 'with'문 이해하기

PYTHON

Python 'with'문 이해하기

나는 거기에 차이점이 있는지, 그 차이점은 무엇인지 이해하려고 노력하고 있습니다.

옵션 1 :

file_obj = open('test.txt', 'r')

with file_obj as in_file:
    print in_file.readlines()

옵션 2 :

with open('test.txt', 'r') as in_file:
    print in_file.readlines()

필자는 Option One에서 file_obj가 with 블록 뒤에 닫힌 상태임을 이해합니다.

해결법

  1. ==============================

    1.왜 아무도 이것을 아직 언급하지 않은 이유는 모르겠습니다. 왜냐하면 그것이 작동하는 방식의 근본이기 때문입니다. 배후에는 파이썬의 많은 언어 기능과 마찬가지로 특수 메서드가 있습니다.이 메서드는 이미 내장 된 Python 개체에 대해 정의되어 있으며 사용자 정의 클래스로 재정의 할 수 있습니다. with와 같은 특별한 경우 (및보다 일반적으로 컨텍스트 관리자), 메소드는 __enter__ 및 __exit__입니다.

    왜 아무도 이것을 아직 언급하지 않은 이유는 모르겠습니다. 왜냐하면 그것이 작동하는 방식의 근본이기 때문입니다. 배후에는 파이썬의 많은 언어 기능과 마찬가지로 특수 메서드가 있습니다.이 메서드는 이미 내장 된 Python 개체에 대해 정의되어 있으며 사용자 정의 클래스로 재정의 할 수 있습니다. with와 같은 특별한 경우 (및보다 일반적으로 컨텍스트 관리자), 메소드는 __enter__ 및 __exit__입니다.

    파이썬에서 모든 것은 객체이며 심지어 리터럴이라는 것을 기억하십시오. 이것이 '안녕하세요'[0]와 같은 일을 할 수있는 이유입니다. 따라서 open에 의해 반환 된 파일 객체를 직접 사용할지 여부는 중요하지 않습니다.

    with open('filename.txt') as infile:
        for line in infile:
            print(line)
    

    다른 이름으로 먼저 저장하십시오 (예 : 긴 행을 분리).

    the_file = open('filename' + some_var + '.txt')
    with the_file as infile:
        for line in infile:
            print(line)
    

    결과적으로 the_file, infile 및 open의 반환 값이 모두 같은 객체를 가리키게되므로 결과는 __enter__ 및 __exit__ 메소드를 호출하는 것과 같습니다. 내장 파일 객체의 __exit__ 메소드는 파일을 닫는 것입니다.

  2. ==============================

    2.이것들은 동일하게 작동합니다. 일반적으로 Python 코드의 의미는 동일한 범위의 변수에 표현식을 할당하여 변경되지 않습니다.

    이것들은 동일하게 작동합니다. 일반적으로 Python 코드의 의미는 동일한 범위의 변수에 표현식을 할당하여 변경되지 않습니다.

    이것이 동일한 이유는 다음과 같습니다.

    f = open("myfile.txt")
    

    filename = "myfile.txt"
    f = open(filename)
    

    별칭을 추가하는지 여부에 관계없이 코드의 의미는 그대로 유지됩니다. 컨텍스트 관리자는 인수를 함수에 전달하는 것보다 더 깊은 의미가 있지만 원칙은 동일합니다. 즉, 컨텍스트 관리자 마술이 동일한 객체에 적용되고 두 경우 모두 파일이 닫힙니다.

    다른 하나를 선택하는 유일한 이유는 코드의 선명도 또는 스타일에 도움이된다고 생각하는 경우입니다.

  3. ==============================

    3.두 파일간에 차이점은 없습니다. - with 블록을 종료 할 때 파일이 닫히는 것입니다.

    두 파일간에 차이점은 없습니다. - with 블록을 종료 할 때 파일이 닫히는 것입니다.

    두 번째 예제는 파일이 Python 2.6 이상에서 사용되는 일반적인 방법입니다 (with 구문이 추가 된 경우).

    첫 번째 예제가 다음과 같이 REPL 세션에서도 작동하는지 확인할 수 있습니다.

    >>> file_obj = open('test.txt', 'r')
    >>> file_obj.closed
    False
    >>> with file_obj as in_file:
    ...     print in_file.readlines()
    <Output>
    >>> file_obj.closed
    True
    

    따라서 with 블록이 종료되면 파일이 닫힙니다.

    일반적으로 두 번째 예는 이런 종류의 일을 수행하는 방법입니다.

    그 여분의 변수 file_obj를 만들 이유가 없습니다 ... in_file을 사용할 수있는 with 블록이 끝난 후에도 할 수있는 모든 것이 있습니다. 범위가 아직 남아 있기 때문입니다.

    >>> in_file
    <closed file 'test.txt', mode 'r' at 0x03DC5020>
    
  4. ==============================

    4.파이썬의 파일 인스턴스의 기본 인스턴스가 변경되지 않은 경우 파이썬을 실행하고 해당 옵션 중 하나만 사용하면 그물 효과는 동일합니다. (옵션 2에서는 file_obj가 이미 살펴본 것처럼 옵션 2의 블록 끝에서 file_obj가 범위를 벗어날 때만 닫힙니다.)

    파이썬의 파일 인스턴스의 기본 인스턴스가 변경되지 않은 경우 파이썬을 실행하고 해당 옵션 중 하나만 사용하면 그물 효과는 동일합니다. (옵션 2에서는 file_obj가 이미 살펴본 것처럼 옵션 2의 블록 끝에서 file_obj가 범위를 벗어날 때만 닫힙니다.)

    그러나 컨텍스트 관리자를 사용하는 경우에는 차이가있을 수 있습니다. 파일은 객체이므로 객체를 수정하거나 하위 클래스로 만들 수 있습니다.

    그 파일이 다른 객체와 같은 역할을하는 file (file_name)을 호출하여 파일을 열 수도 있습니다 (단, 파이썬에서 파일을 열지 않는 한 그 누구도 파일을 열 수 없습니다).

    >>> f=open('a.txt')
    >>> f
    <open file 'a.txt', mode 'r' at 0x1064b5ae0>
    >>> f.close()
    
    >>> f=file('a.txt')
    >>> f
    <open file 'a.txt', mode 'r' at 0x1064b5b70>
    >>> f.close()
    

    보다 일반적으로, the_thing (일반적으로 파일이지만 아무것도 될 수 있음)이라는 일부 리소스의 열기 및 닫기는 다음 단계를 따르십시오.

    set up the_thing                       # resource specific, open, or call the obj
    try                                    # generically __enter__
        yield pieces from the_thing
    except
        react if the_thing is broken 
    finally, put the_thing away            # generically __exit__
    

    컨텍스트 관리자와 코드의 다른 요소들간에 엮인 절차 코드를 사용하여 하위 요소의 흐름을보다 쉽게 ​​변경할 수 있습니다.

    파이썬 2.5 이후, 파일 객체는 __enter__ 및 __exit__ 메쏘드를 가지고 있습니다 :

    >>> f=open('a.txt')
    >>> f.__enter__
    <built-in method __enter__ of file object at 0x10f836780>
    >>> f.__exit__
    <built-in method __exit__ of file object at 0x10f836780>
    

    기본 Python 파일 객체는 다음과 같은 방식으로 이러한 메소드를 사용합니다.

    __init__(...)            # performs initialization desired
    
    __enter__() -> self      # in the case of `file()` return an open file handle
    
    __exit__(*excinfo) -> None.  # in the case of `file()` closes the file.
    

    이러한 메소드는 자원을 열거 나 닫을 때 자원을 처리하는 방법을 수정하기 위해 사용자가 직접 변경할 수 있습니다. 컨텍스트 관리자를 사용하면 파일을 열거 나 닫을 때 발생하는 상황을 쉽게 수정할 수 있습니다.

    간단한 예 :

    class Myopen(object):
        def __init__(self, fn, opening='', closing='', mode='r', buffering=-1):
            # set up the_thing
    
            if opening:
                print(opening)
            self.closing=closing    
            self.f=open(fn, mode, buffering)
    
        def __enter__(self):
            # set up the_thing
            # could lock the resource here
            return self.f
    
        def __exit__(self, exc_type, exc_value, traceback):
            # put the_thing away
            # unlock, or whatever context applicable put away the_thing requires
            self.f.close()
            if self.closing:
                print(self.closing)  
    

    이제 시도해보십시오.

    >>> with Myopen('a.txt', opening='Hello', closing='Good Night') as f:
    ...     print f.read()
    ...
    Hello
    [contents of the file 'a.txt']
    Good Night
    

    자원에 대한 진입 및 종료를 제어하면 많은 유스 케이스가 있습니다.

    PEP 343에서 더 많은 예를 읽을 수 있습니다.

  5. from https://stackoverflow.com/questions/32379147/understanding-the-python-with-statement by cc-by-sa and MIT license