Skip to content

Instantly share code, notes, and snippets.

@DoonDoony
Last active October 14, 2018 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DoonDoony/f8ee175135074e6b3b019fca65b99098 to your computer and use it in GitHub Desktop.
Save DoonDoony/f8ee175135074e6b3b019fca65b99098 to your computer and use it in GitHub Desktop.
Python Function Decorator Example #1
from urllib.parse import urljoin
import urllib3
from urllib3.exceptions import HTTPError
def response_ok(func):
def validate(*args, **kwargs):
result = func(*args, **kwargs)
if result.status != 200:
raise HTTPError(f'Request Failed with status code {result.status}')
return result
return validate
@response_ok
def fetch(path):
with urllib3.PoolManager() as http:
return http.request('GET', path)
if __name__ == '__main__':
api = 'http://httpbin.org'
url = urljoin(api, 'ip') # 존재하는 URL 입니다. 200 응답을 기대합니다
wrong_url = urljoin(api, 'pi') # 존재하지 않는 URL 입니다. 404 응답을 기대합니다
fetch(url).data.decode() # '{\n "origin": "1.2.3.4"\n}\n'
fetch(wrong_url).data.decode() # urllib3.exceptions.HTTPError: Request Failed with status code 404
import functools
import time
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f'{func.__name__} took {round((time.time() - start), 4)} seconds')
return result
return wrapper
# timer 데코레이터 적용
@timer
def huge_add(a, b):
result = a + b
time.sleep(1)
return result
@timer
def huge_subtract(a, b):
result = a + b
time.sleep(1)
return result
@timer
def huge_multiply(a, b):
result = a * b
time.sleep(1)
return result
if __name__ == '__main__':
huge_number = 10e8
huge_add(huge_number, huge_number)
huge_subtract(huge_number, huge_number)
huge_multiply(huge_number, huge_number)
# 출력, 이제는 간편하게 호출된 함수 이름도 확인할 수 있습니다
# huge_add took 1.0037 seconds
# huge_subtract took 1.0044 seconds
# huge_multiply took 1.0028 seconds
import time
# 시작, 종료 시간을 체크해서 프린트 하는 코드를 함수안에 반영합니다.
def huge_add(a, b):
start = time.time()
result = a + b
time.sleep(1)
print(f'add Elapsed time: {round((time.time() - start), 4)} seconds')
return result
# huge_add 와 같은 일을 하는 코드가 반복됩니당
def huge_subtract(a, b):
start = time.time()
result = a + b
time.sleep(1)
print(f'subtract Elapsed time: {round((time.time() - start), 4)} seconds')
return result
# 같은 일을 하는 코드가 반복됩니당
def huge_multiply(a, b):
start = time.time()
result = a * b
time.sleep(1)
print(f'multiply Elapsed time: {round((time.time() - start), 4)} seconds')
return result
if __name__ == '__main__':
huge_number = 10e8
huge_add(huge_number, huge_number)
huge_subtract(huge_number, huge_number)
huge_multiply(huge_number, huge_number)
# 출력
# add Elapsed time: 1.0039 seconds
# subtract Elapsed time: 1.0048 seconds
# multiply Elapsed time: 1.0048 seconds
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment