모듈 (및 패키지)은 프로그램을 별도의 네임 스페이스로 나누는 훌륭한 Python 방식이며,이 질문의 암묵적인 목표 인 것 같습니다. 사실, 파이썬의 기초를 배우면서 블록 스코프 기능이 없다는 사실에 실망했습니다. 그러나 일단 파이썬 모듈을 이해하면 블록 범위 없이도 이전 목표를 더 우아하게 실현할 수있었습니다.
동기를 부여하고 사람들을 올바른 방향으로 안내하기 위해 Python의 범위 지정 구문에 대한 명시적인 예를 제공하는 것이 유용하다고 생각합니다. 먼저 Python 클래스를 사용하여 블록 범위를 구현하는 데 실패한 시도를 설명합니다. 다음으로 파이썬 모듈을 사용하여 더 유용한 것을 어떻게 얻었는지 설명합니다. 마지막으로 데이터로드 및 필터링에 패키지를 실제로 적용하는 방법에 대해 설명합니다.
클래스로 블록 범위 시도
잠시 동안 클래스 선언 내부에 코드를 붙여서 블록 범위를 달성했다고 생각했습니다.
x = 5
class BlockScopeAttempt:
x = 10
print(x)
print(x)
불행히도 이것은 함수가 정의되면 분해됩니다.
x = 5
class BlockScopeAttempt:
x = 10
print(x)
def printx2():
print(x)
printx2()
클래스 내에 정의 된 함수는 전역 범위를 사용하기 때문입니다. 이 문제를 해결하는 가장 쉬운 (유일한 것은 아니지만) 방법은 클래스를 명시 적으로 지정하는 것입니다.
x = 5
class BlockScopeAttempt:
x = 10
print(x)
def printx2():
print(BlockScopeAttempt.x)
printx2()
클래스에 포함되어 있는지 여부에 따라 함수를 다르게 작성해야하기 때문에 이것은 그렇게 우아하지 않습니다.
Python 모듈로 더 나은 결과
모듈은 정적 클래스와 매우 유사하지만 모듈은 내 경험에서 훨씬 더 깔끔합니다. 모듈로 동일한 작업을 수행하기 my_module.py
위해 다음 내용으로 현재 작업 디렉토리에 라는 파일을 만듭니다 .
x = 10
print(x)
def printx():
global x
print(x)
그런 다음 주 파일 또는 대화 형 (예 : Jupyter) 세션에서
x = 5
import my_module
my_module.printx()
print(x)
설명으로 각 Python 파일은 자체 전역 네임 스페이스를 가진 모듈을 정의합니다. 모듈을 가져 오면 .
구문 을 사용하여이 네임 스페이스의 변수에 액세스 할 수 있습니다 .
대화식 세션에서 모듈로 작업하는 경우 처음에이 두 줄을 실행할 수 있습니다.
%load_ext autoreload
%autoreload 2
모듈은 해당 파일이 수정되면 자동으로 다시로드됩니다.
데이터로드 및 필터링을위한 패키지
패키지의 개념은 모듈 개념을 약간 확장 한 것입니다. 패키지는 __init__.py
가져올 때 실행되는 파일 (비어있을 수 있음)을 포함하는 디렉토리 입니다. 이 디렉토리 내의 모듈 / 패키지는 .
구문을 사용하여 액세스 할 수 있습니다 .
데이터 분석을 위해 대용량 데이터 파일을 읽고 대화식으로 다양한 필터를 적용해야하는 경우가 많습니다. 파일을 읽는 데 몇 분이 걸리므로 한 번만하고 싶습니다. 객체 지향 프로그래밍에 대해 학교에서 배운 내용을 기반으로 클래스의 메서드로 필터링 및로드를위한 코드를 작성해야한다고 믿었습니다. 이 방법의 가장 큰 단점은 필터를 재정의하면 클래스 정의가 변경되므로 데이터를 포함한 전체 클래스를 다시로드해야한다는 것입니다.
요즘 Python에서는 및 my_data
이라는 하위 모듈이 포함 된라는 패키지를 정의합니다 . 내부 에서 상대 가져 오기를 수행 할 수 있습니다.load
filter
filter.py
from .load import raw_data
내가 수정하는 경우 filter.py
, 다음 autoreload
의 변화를 감지합니다. 다시로드되지 않으므로 load.py
데이터를 다시로드 할 필요가 없습니다. 이렇게하면 Jupyter 노트북에서 필터링 코드의 프로토 타입을 만들고 함수로 래핑 한 다음 노트북에서 filter.py
. 이 문제를 파악하는 것은 내 작업 흐름에 혁명을 일으켰고 나를 회의론자에서 "Zen of Python"의 신자로 전환했습니다.
One purpose (of many) is to improve code readability
-올바르게 작성된 (즉, python을 따르는) Python 코드 는 이러한 장식을 읽을 필요가 없습니다. 사실, 파이썬에 대해 내가 좋아하는 (많은) 것 중 하나입니다.