2016-09-22 2 views
1

with의 범위에 바인딩 된 전역 변수가 with 문에 as 슈트의 VAR으로 만들 수 있습니까? f 변수 아래의 예에 할당 또한 외부 withwith 문 후 :소송으로 globaly가 with 문을 지정합니다. 파이썬

with open("some_text.txt") as f: 
    pass 

print(f.closed) 
print(f) 

이 반환

>>> True 
<_io.TextIOWrapper name='some_text.txt' mode='r' encoding='UTF-8'> 

as VAR 여전히 내가 내부 with를 사용하는 경우에도 바인딩 함수 :

def longerThan10Chars(*files): 
    for my_file in files: 
     with open(my_file) as f: 
      for line in f: 
       if len(line) >= 10: 
        print(line) 
    print(f.closed) 

여기서 f.closed은 여전히 ​​0을 인쇄합니다..

+0

'with..as' 블록 뒤에'f'가 언 바운드되기를 원한다는 말입니까? –

+0

@PatrickHaugh 네, 그게 내가 말하려고했던 것입니다. – amirteymuri

+0

수 없습니다. 파이썬에는 세분화 된 범위가 없습니다. –

답변

4

파이썬 범위 경계는 기능입니다. with 블록을 범위로 만들 수있는 옵션이 없습니다. 별도의 범위로 만들어야하는 경우 함수에 넣습니다. as 대상은 다른 지역이며 해당 새 기능 외부에 존재하지 않습니다.

아니면 이름 만 명시 적으로 이름을 삭제하여 멀리 with 문 다음에 갈 수 있도록 할 수 있습니다

with open("some_text.txt") as f: 
    pass 

del f 
+0

'as' 변수는 함수 내부에서도 여전히 바인딩되어있는 것 같습니다. 내 업데이 트를 봐. 그래서'델'만이 일하게 될 것입니다. – amirteymuri

+0

그는 함수에서'f'가 할당 된 모든 코드를 캡슐화 한 다음 함수 밖에서'f'가 할당되지 않은 모든 작업을 수행한다는 것을 의미합니다. –

+0

Aaah, 이제 알았습니다. – amirteymuri

-1

f의 바인딩을 제거하려면이 수행

del locals()['f'] 

당신은이 작업을 수행해야 수동으로. with...as 블록은이 작업을 수행 할 수 없습니다.

+0

왜 간접 지정입니까? 'del f'는 훨씬 더 직접적입니다; 'f'는 여기서 동적이지 않습니다. 그리고'locals()'를 삭제하는 것은 실제 locals에 영향을주지 않습니다 * 왜냐하면'locals()'는 함수의 실제 locals 배열만을 반영하기 때문입니다. –

+0

다른 말로하면, 당신이 제안하는 것은 함수 밖의 * global * 수준에서만 작동 할 것입니다. 왜냐하면'locals()'는 모듈의 실제 네임 스페이스 인'globals()'와 같은 사전을 반환하기 때문입니다. 직접 편집 할 수 있습니다. –

관련 문제