-
Python fastcore: 파이썬 업그레이드 모듈컴퓨터/파이썬 2020. 10. 17. 00:24728x90반응형
fastcore
fast.ai에서 제작한 파이썬 언어 확장 모듈
1. 소개
fastcore은 Julia 언어의 multiple dispatch, Ruby 언어의 mixins, Haskell 언어의 currying, binding 등
다른 언어의 기능들이나, 파이썬 내장 기능을 업그레이드한 모듈이다.
설치법은 conda나 pip으로 설치
conda install fastcore
pip install fastcore
2. 기능
글 모든 예제는 아래를 import 하는 걸 전제로 한다.
from fastcore.all import *
1. Test assertion
test_eq(a, b)
: 위 함수는 assert a == b와 같다.
test_eq([0, 1, 2, 3], range(4)) # True
test_fail(f, msg='', contains='')
: 위 함수는 Exception을 test 할 수 있다.
def customException(): return 1 / 0 test_fail(customException) # ZeroDivisionError: division by zero
나머지 test 함수들은 문서 참고: 링크 열기
2. **kwargs 위임
delegates 문서 링크
delegates (위임) 함수로 **kwargs를 명확히 표시할 수 있다.
예를 들어 inspect.signature(함수나 클래스)를 이용하면 그 함수/클래스의 매개변수 목록이 나오는데,
(API 사용할 때 유용)
기본 파이썬에선 base로 하는 함수/클래스 키워드들을 정확히 표시 안 해주지만
(e, a, **kwargs)
import inspect def adder(a, b=1, c=2, d=3): return a + b + c def more_adder(e, a, **kwargs): return e + adder(a, **kwargs) print(inspect.signature(more_adder) # 결과 = <Signature (e, a, **kwargs)>
@delegates() 함수를 사용하면 아래와 같이 나온다.
(e, a, b=1, c=2, d=3)
import inspect def adder(a, b=1, c=2, d=3): return a + b + c @delegates(adder) def more_adder(e, a, **kwargs): return e + adder(a, **kwargs) print(inspect.signature(more_adder) # 결과 = <Signature (e, a, b=1, c=2, d=3)>
3. class init 함수 간결화
store_attr() 문서 링크
맘에 드는 기능 중 하나인데, store_attr() 함수를 이용한 예제를 보자.
1. 원본: Node의 f, g, h 값 설정, self.? 를 반복적으로 사용하기 귀찮다.
class Node: def __init__(self, f, g, h=0): self.f = f self.g = g self.h = h
2. fastcore의 store_attr() 사용
class Node: def __init__(self, f, g, h=0): store_attr()
둘 다 같은 결과가 나온다.
node = Node(1, 2, 3) print(node.f, node.g, node.h) # 1, 2, 3
store_attr 에다가 but=["param"]이나 cast=True를 이용할 수 있다.
cast 예제
class T: def __init__(self, a:L, b, c:str): store_attr('a,b,c', cast=True) t = T(1,c=2,b=3) # 1은 알아서 [1] 로, b = 3, 2는 알아서 '2'로 변한다. assert t.a==[1] and t.b==3 and t.c=='2'
4. Type dispatch
Julia란 언어의 멀티 디스패치 기능인데, Generic이랑 비슷? 하다.
예제
@typedispatch def print_type(x: float): print("I'm float") @typedispatch def print_type(x: int): print("I'm int") @typedispatch def print_type(x: str): print("I'm str") @typedispatch def print_type(x: list): print("I'm list") @typedispatch def print_type(x: Callable): print("I'm function") if __name__ == "__main__": print_type(11.0) # I'm float print_type(11) # I'm int print_type("eleven") # I'm str print_type([11]) # I'm list print_type(print_type) # I'm function
5. __repr__
1) 파이썬 원본
class Node: def __init__(self, f, g, h=0): store_attr() print(Node(1, 2, 3)) # 결과 : <__main__.Node object at 0x000001A3E3DD4A48>
2) fastcore 이용
class Node: def __init__(self, f, g, h=0): store_attr() __repr__ = basic_repr("f,g,h") print(Node(1, 2, 3)) # 결과 : Node(f=1, g=2, h=3)
6. @patch
@patch 데코레이터는 외부 라이브러리에 자신의 함수를 추가할 때 유용하다.
예제
bigO 라이브러리에 add란 함수를 추가한다.
add 함수는 random 배열에다가 원하는 요소 하나를 추가한다.
from bigO import bigO @patch def add(self: bigO, num): return self.genRandomArray(10) + [num] if __name__ == "__main__": lib = bigO() print(lib.add("ADD THIS")) # genRandomArray(10)은 크기 10의 랜덤 배열을 생성한다. # 결과 # [9, 9, -9, -10, -1, -2, -2, 6, -10, 10, 'ADD THIS']
7. mixin
fastcore가 Path 라이브러리에 ls() 기능을 patch 시켰다.
원본 파이썬에선 ls()가 없다. 하지만, fastcore랑 같이 import를 하면 아래와 같다.
from pathlib import Path p = Path("JS") # JS 폴더 불러오기 print(p.ls()) # dos 스타일 ls 명령어 # 결과 : (#6) [Path('JS/coffee html.js'),Path('JS/discordBot.js'),Path('JS/HTML5 audio.js'),Path('JS/imageminwebp.js'),Path('JS/test.json'),Path('JS/Untitled-3.js')]
아까 배운 patch를 이용해서 ls를 한 배열의 길이를 구해보자.
@patch def length(self:Path): return len(self.ls()) p.length() # 6
8. Self (람다)
대문자 S, Self.sum()을 하면 lambda o: o.sum()한 것과 같다.
from fastcore.utils import Self, L if __name__ == "__main__": f = Self.sum() x = L(1, 2, 3) print(f(x)) f = Self.map(lambda a: a + 1) x = L(1, 2, 3) print(f(x)) f = Self.map(float) x = L(1, 2, 3) print(f(x)) f = Self.map(lambda a: a ** 2) x = L(1, 2, 3) print(f(x)) f = Self.filter(lambda a: a % 2 == 1) x = L(1, 2, 3) print(f(x)) f = Self.reduce(lambda a, b: a if a > b else b) x = L(1, 2, 3) print(f(x))
9. L (List 업그레이드 버전)
마지막으로 소개해드릴 기능은, 파이썬의 리스트를 확장시킨 fastcore의 L이다.
print 하면 앞에 길이도 나온다.
a = L(1, 2, 3) print(a) # (#3) [1,2,3] print(a[1]) # 2
예제
print(L.range(20).shuffle()) # 결과: (#20) [6,15,10,1,14,3,17,19,9,12...] 10개 이상부턴 truncate 해준다. '...' print(1 + L(2,3,4)) # List + Int 가능 # 결과: (#4) [1,2,3,4] print(p[2,4,6]) # 인덱스 모음으로 배열을 만들어준다. # 결과: (#3) [10,14,17]
쓸만한 기능들이 더 많은데, 공식 링크에서 한 번 구경해보면 좋다.
참고 링크
728x90'컴퓨터 > 파이썬' 카테고리의 다른 글
Python kth Hamming number (해밍 수) (0) 2020.10.19 Python random bool 생성 (0) 2020.10.16 Python random 모듈 구현하기 (0) 2020.10.14