한 기사로 Python 데코레이터 이해하기
Python은 초보자에게 친숙한 언어입니다. 그러나 데코레이터와 같이 마스터하기 어려운 고급 기능도 많이 있습니다. 많은 초보자들은 데코레이터와 그 작동 방식을 전혀 이해하지 못했습니다. 이 기사에서는 데코레이터의 모든 것을 소개합니다.
Python에서 함수는 매우 유연한 구조입니다. 변수에 할당하거나, 다른 함수에 매개변수로 전달하거나, 함수의 출력으로 사용할 수 있습니다. 데코레이터는 본질적으로 다른 함수가 수정 없이 일부 기능을 추가할 수 있도록 하는 함수입니다.
이것은 "장식"의 의미입니다. 이 "장식" 자체가 기능을 나타냅니다. 다른 기능을 수정하는 데 사용한다는 것은 해당 기능에 이 기능을 추가하는 것을 의미합니다.
일반적으로 데코레이터에서 제공하는 @ 구문 설탕(Syntactic Sugar)을 사용하여 다른 기능이나 객체를 장식할 수 있습니다. 아래와 같이 @dec 데코레이터를 사용하여 func() 함수를 장식합니다.
@dec def func(): pass
데코레이터를 이해하는 가장 좋은 방법은 데코레이터가 해결하는 문제가 무엇인지 이해하는 것입니다. 문제를 해결하고 우아함과 강력함을 보여줍니다.
설정 문제
데코레이터의 목적을 이해하기 위해 간단한 예를 살펴보겠습니다. 두 번째 매개변수의 기본값이 10인 간단한 덧셈 함수 dec.py가 있다고 가정해 보겠습니다.
# dec.py def add(x, y=10): return x + y
이 덧셈 함수를 자세히 살펴보겠습니다.
>>> add(10, 20) 30 >>> add <function add at 0x7fce0da2fe18> >>> add.__name__ 'add' >>> add.__module__ '__main__' >>> add.__defaults__ # default value of the `add` function (10,) >>> add.__code__.co_varnames # the variable names of the `add` function ('x', 'y')
이것이 무엇인지 이해할 필요는 없습니다. Python의 모든 함수는 객체이며 다양한 속성과 메서드를 가지고 있습니다. 검사 모듈을 통해 add() 함수의 소스 코드를 볼 수도 있습니다:
>>> from inspect import getsource >>> print(getsource(add)) def add(x, y=10): return x + y
이제 어떤 방식으로든 더하기 함수를 사용합니다. 예를 들어 몇 가지 작업을 사용하여 함수를 테스트합니다.
# dec.py from time import time def add(x, y=10): return x + y print('add(10)', add(10)) print('add(20, 30)', add(20, 30)) print('add("a", "b")', add("a", "b")) Output: i add(10) 20 add(20, 30) 50 add("a", "b") ab
원하는 경우 각 작업의 기능 이해 시간에 대해 시간 모듈을 호출할 수 있습니다:
# dec.py from time import time def add(x, y=10): return x + y before = time() print('add(10)', add(10)) after = time() print('time taken: ', after - before) before = time() print('add(20, 30)', add(20, 30)) after = time() print('time taken: ', after - before) before = time() print('add("a", "b")', add("a", "b")) after = time() print('time taken: ', after - before) Output: add(10) 20 time taken:6.699562072753906e-05 add(20, 30) 50 time taken:6.9141387939453125e-06 add("a", "b") ab time taken:6.9141387939453125e-06
이제 프로그래머로서 조금 가려우신가요? 결국 우리는 항상 동일한 코드를 복사하여 붙여넣는 것을 좋아하지 않습니다. 현재 코드는 읽기가 쉽지 않습니다. 무언가를 변경하려면 해당 코드가 나타나는 모든 부분을 수정해야 합니다. Python에는 더 나은 방법이 있을 것입니다.
다음과 같이 추가 기능에서 실행 시간을 직접 캡처할 수 있습니다.
# dec.py from time import time def add(x, y=10): before = time() rv = x + y after = time() print('time taken: ', after - before) return rv print('add(10)', add(10)) print('add(20, 30)', add(20, 30)) print('add("a", "b")', add("a", "b"))
이 방법은 이전 방법보다 확실히 좋습니다. 하지만 다른 기능이 있으면 불편할 것 같습니다. 여러 함수가 있는 경우:
# dec.py from time import time def add(x, y=10): before = time() rv = x + y after = time() print('time taken: ', after - before) return rv def sub(x, y=10): return x - y print('add(10)', add(10)) print('add(20, 30)', add(20, 30)) print('add("a", "b")', add("a", "b")) print('sub(10)', sub(10)) print('sub(20, 30)', sub(20, 30))
add와 sub가 모두 함수이기 때문에 이를 활용하여 타이머 함수를 작성할 수 있습니다. 우리는 타이머가 함수의 작동 시간을 계산하기를 원합니다:
def timer(func, x, y=10): before = time() rv = func(x, y) after = time() print('time taken: ', after - before) return rv
이것은 좋지만 다음과 같이 다른 함수를 타이머 함수로 래핑해야 합니다.
print('add(10)', timer(add,10)))
이제 기본값은 여전히 10인가요? 반드시 그런 것은 아닙니다. 그렇다면 어떻게 하면 더 잘할 수 있을까요?
아이디어는 다음과 같습니다. 새 타이머 함수를 만들고, 다른 함수를 래핑하고, 래핑된 함수를 반환합니다.
def timer(func): def f(x, y=10): before = time() rv = func(x, y) after = time() print('time taken: ', after - before) return rv return f
이제 add 및 sub 함수를 타이머로 래핑하기만 하면 됩니다.
add = timer(add)
그렇습니다! 전체 코드는 다음과 같습니다.
# dec.py from time import time def timer(func): def f(x, y=10): before = time() rv = func(x, y) after = time() print('time taken: ', after - before) return rv return f def add(x, y=10): return x + y add = timer(add) def sub(x, y=10): return x - y sub = timer(sub) print('add(10)', add(10)) print('add(20, 30)', add(20, 30)) print('add("a", "b")', add("a", "b")) print('sub(10)', sub(10)) print('sub(20, 30)', sub(20, 30)) Output: time taken:0.0 add(10) 20 time taken:9.5367431640625e-07 add(20, 30) 50 time taken:0.0 add("a", "b") ab time taken:9.5367431640625e-07 sub(10) 0 time taken:9.5367431640625e-07 sub(20, 30) -10
프로세스를 요약해 보겠습니다. 추가 기능과 같은 기능이 있고 타이밍과 같은 작업으로 해당 기능을 래핑합니다. 패키징의 결과는 특정한 새로운 기능을 구현할 수 있는 새로운 기능입니다.
물론 기본값에 문제가 있으니 나중에 수정하겠습니다.
Decorator
이제 위의 솔루션은 일반적인 동작을 사용하여 특정 기능을 래핑하는 데코레이터의 아이디어에 매우 가깝습니다. 데코레이터를 사용한 후의 코드는 다음과 같습니다.
def add(x, y=10): return x + y add = timer(add) You write: @timer def add(x, y=10): return x + y
둘 다 동일한 효과를 가지며, 이것이 Python 데코레이터가 수행하는 작업입니다. 구현하는 함수는 데코레이터가 함수 위에 구문을 배치하고 구문이 @timer로 더 간단하다는 점을 제외하면 add = 타이머(add)와 유사합니다.
# dec.py from time import time def timer(func): def f(x, y=10): before = time() rv = func(x, y) after = time() print('time taken: ', after - before) return rv return f @timer def add(x, y=10): return x + y @timer def sub(x, y=10): return x - y print('add(10)', add(10)) print('add(20, 30)', add(20, 30)) print('add("a", "b")', add("a", "b")) print('sub(10)', sub(10)) print('sub(20, 30)', sub(20, 30))
매개변수 및 키워드 매개변수
아직 해결되지 않은 작은 문제가 있습니다. 타이머 함수에서는 매개변수 x와 y를 하드코딩합니다. 즉, y의 기본값을 10으로 지정합니다. 인수와 키워드 인수를 함수에 전달하는 방법, 즉 *args 및 **kwargs가 있습니다. 매개변수는 함수의 표준 매개변수(이 경우 x가 매개변수)이고 키워드 매개변수는 이미 기본값(이 경우 y=10)이 있는 매개변수입니다. 코드는 다음과 같습니다.
# dec.py from time import time def timer(func): def f(*args, **kwargs): before = time() rv = func(*args, **kwargs) after = time() print('time taken: ', after - before) return rv return f @timer def add(x, y=10): return x + y @timer def sub(x, y=10): return x - y print('add(10)', add(10)) print('add(20, 30)', add(20, 30)) print('add("a", "b")', add("a", "b")) print('sub(10)', sub(10)) print('sub(20, 30)', sub(20, 30))
이제 타이머 함수는 이러한 매개변수를 함수에 전달하기 때문에 모든 함수, 매개변수 및 기본값 설정을 처리할 수 있습니다.
Higher Order Decorators
궁금하실 수도 있습니다. 유용한 동작을 추가하기 위해 함수를 다른 함수로 래핑할 수 있다면 한 단계 더 나아갈 수 있을까요? 함수를 다른 함수로 래핑하고 다른 함수로 래핑합니까?
예! 실제로 기능은 원하는 만큼 깊어질 수 있습니다. 예를 들어, 함수를 n번 실행하는 데코레이터를 작성하려고 합니다. 아래와 같이:
def ntimes(n): def inner(f): def wrapper(*args, **kwargs): for _ in range(n): rv = f(*args, **kwargs) return rv return wrapper return inner
그런 다음 위 함수를 사용하여 이전 기사의 add 함수와 같은 다른 함수를 래핑할 수 있습니다.
@ntimes(3) def add(x, y): print(x + y) return x + y
출력 문은 코드가 실제로 3번 실행되었음을 보여줍니다.
위 내용은 한 기사로 Python 데코레이터 이해하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











대부분의 텍스트 편집기를 사용하여 XML 파일을여십시오. 보다 직관적 인 트리 디스플레이가 필요한 경우 Oxygen XML 편집기 또는 XMLSPy와 같은 XML 편집기를 사용할 수 있습니다. 프로그램에서 XML 데이터를 처리하는 경우 프로그래밍 언어 (예 : Python) 및 XML 라이브러 (예 : XML.etree.elementtree)를 사용하여 구문 분석해야합니다.

XML을 PDF로 직접 변환하는 응용 프로그램은 근본적으로 다른 두 형식이므로 찾을 수 없습니다. XML은 데이터를 저장하는 데 사용되는 반면 PDF는 문서를 표시하는 데 사용됩니다. 변환을 완료하려면 Python 및 ReportLab과 같은 프로그래밍 언어 및 라이브러리를 사용하여 XML 데이터를 구문 분석하고 PDF 문서를 생성 할 수 있습니다.

모바일 XML에서 PDF의 속도는 다음 요인에 따라 다릅니다. XML 구조의 복잡성. 모바일 하드웨어 구성 변환 방법 (라이브러리, 알고리즘) 코드 품질 최적화 방법 (효율적인 라이브러리 선택, 알고리즘 최적화, 캐시 데이터 및 다중 스레딩 사용). 전반적으로 절대적인 답변은 없으며 특정 상황에 따라 최적화해야합니다.

작은 XML 파일의 경우 주석 내용을 텍스트 편집기로 직접 교체 할 수 있습니다. 큰 파일의 경우 XML 파서를 사용하여 효율성과 정확성을 보장하기 위해 수정하는 것이 좋습니다. XML 주석을 삭제할 때주의를 기울이면 주석을 유지하면 일반적으로 코드 이해 및 유지 관리에 도움이됩니다. 고급 팁은 XML 파서를 사용하여 댓글을 수정하기위한 파이썬 샘플 코드를 제공하지만 사용 된 XML 라이브러리에 따라 특정 구현을 조정해야합니다. XML 파일을 수정할 때 인코딩 문제에주의하십시오. UTF-8 인코딩을 사용하고 인코딩 형식을 지정하는 것이 좋습니다.

XML 서식 도구는 규칙에 따라 코드를 입력하여 가독성과 이해를 향상시킬 수 있습니다. 도구를 선택할 때는 사용자 정의 기능, 특수 상황 처리, 성능 및 사용 편의성에주의하십시오. 일반적으로 사용되는 도구 유형에는 온라인 도구, IDE 플러그인 및 명령 줄 도구가 포함됩니다.

모바일에는 간단하고 직접 무료 XML에서 PDF 툴이 없습니다. 필요한 데이터 시각화 프로세스에는 복잡한 데이터 이해 및 렌더링이 포함되며 시장에있는 소위 "무료"도구의 대부분은 경험이 좋지 않습니다. 컴퓨터 측 도구를 사용하거나 클라우드 서비스를 사용하거나보다 신뢰할 수있는 전환 효과를 얻기 위해 앱을 개발하는 것이 좋습니다.

휴대폰에서 고품질로 XML을 PDF로 변환하려면 클라우드에서 XML을 구문 분석하고 서버리스 컴퓨팅 플랫폼을 사용하여 PDF를 생성합니다. 효율적인 XML 파서 및 PDF 생성 라이브러리를 선택하십시오. 오류를 올바르게 처리합니다. 휴대 전화에서 무거운 작업을 피하기 위해 클라우드 컴퓨팅 파워를 최대한 활용하십시오. 복잡한 XML 구조 처리, 다중 페이지 PDF 생성 및 이미지 추가를 포함하여 요구 사항에 따라 복잡성을 조정하십시오. 로그 정보를 인쇄하여 디버그를 돕습니다. 성능을 최적화하고 효율적인 파서 및 PDF 라이브러리를 선택하고 비동기 프로그래밍 또는 XML 데이터를 사용할 수 있습니다. 우수한 코드 품질과 유지 관리를 보장하십시오.

단일 애플리케이션으로 휴대 전화에서 직접 XML에서 PDF 변환을 완료하는 것은 불가능합니다. 두 단계를 통해 달성 할 수있는 클라우드 서비스를 사용해야합니다. 1. 클라우드에서 XML을 PDF로 변환하십시오. 2. 휴대 전화에서 변환 된 PDF 파일에 액세스하거나 다운로드하십시오.
