Functional Python Library - Partial.py
Partial.py๋ ํจ์ํ ํ์ด์ฌ์ ๋ ๋ง์ ์์ญ์์ ์ฌ์ฉํ๊ณ ์, ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ ํ์ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Partial.py๋ ๋ถ๋ถ ์ ์ฉ, ํ์ดํ๋ผ์ธ, ๋น๋๊ธฐ ์ ์ด ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
์ค์นํ๊ธฐ
Partial.py ์ค์น
git์ผ๋ก ์ค์นํ๊ธฐ:
$ git clone https://github.com/marpple/partial.py.git
$ cd partial.py
$ sudo python setup.py install
ํน์
pypi๋ก ์ค์นํ๊ธฐ:
$ pip install partial.py
Partial.py ์ฌ์ฉ
๋ค์์คํ์ด์ค๋ก ์ฌ์ฉํ _
, __
, ___
๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
from partial import _, __, ___
๋ ๋์ ๋ถ๋ถ ์ ์ฉ (Partial application)
Partial.py๋ ์ด๋ฆ์ฒ๋ผ ๋ถ๋ถ ์ ์ฉ(Partial application)์ ์ค์ํ๊ฒ ์๊ฐํฉ๋๋ค. ๊ธฐ์กด์ _.partial
ํจ์๋ ์ผ์ชฝ์์๋ถํฐ๋ง ์ธ์๋ฅผ ์ ์ฉํด๋ ์ ์์ต๋๋ค. Partial.py์ _.partial
ํจ์๋ ๋งจ ์ค๋ฅธ์ชฝ ์ธ์๋ ๋งจ ์ค๋ฅธ์ชฝ์์ ๋ ๋ฒ์งธ์๋ง ์ธ์๋ฅผ ์ ์ฉํด๋๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฉฐ, ์๋ก์ด ๊ตฌ๋ถ์์ธ ___
๋ฅผ ํ์ฉํ์ฌ ์ค๊ฐ ์ง์ ์ ์ธ์๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฉ๋๋๋ก ๋น์๋ ์ ์์ต๋๋ค.
_.partial์ ์ผ๋ฐ์ ์ฌ์ฉ
_.partial
์ ์คํํ๋ฉด์ ์ธ์ ์๋ฆฌ์ _
๋ฅผ ๋๊ธฐ๋ฉด ๋ถ๋ถ ์ ์ฉํ ์ธ์๋ฅผ ๊ฑด๋๋ ์ ์์ต๋๋ค. _
๋ฅผ ์ด์ฉํ๋ฉด ์ํ๋ ๊ณณ์๋ง ์ธ์๋ฅผ ๋ถ๋ถ ์ ์ฉํด๋ ์ ์์ต๋๋ค. _
๊ฐ ์๋ ์๋ฆฌ๋ ์ดํ ์คํ์ ์ฑ์์ง๋๋ค.
pc = _.partial(print, 1)
pc(2)
# ๊ฒฐ๊ณผ: 1 2
# 2 ๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ค์ด๊ฐ๋๋ค.
pc(2, 3)
# ๊ฒฐ๊ณผ: 1 2 3
# 2, 3์ด ์ค๋ฅธ์ชฝ์ผ๋ก ๋ค์ด๊ฐ๋๋ค.
pc = _.partial(print, _, 2)
pc(1)
# ๊ฒฐ๊ณผ: 1 2
# 1์ด ์ผ์ชฝ์ _ ์๋ฆฌ์ ๋ค์ด๊ฐ๋๋ค.
pc(1, 3)
# ๊ฒฐ๊ณผ: 1 2 3
# 1์ด ์ผ์ชฝ์ _ ์๋ฆฌ์ ๋ค์ด๊ฐ๊ณ 3์ด ์ค๋ฅธ์ชฝ์ผ๋ก ๋ค์ด๊ฐ๋๋ค.
pc = _.partial(print, _, _, 3)
pc(1)
# ๊ฒฐ๊ณผ: 1 undefined 3
# 1์ด ์ผ์ชฝ์ _ ์๋ฆฌ์ ๋ค์ด๊ฐ๊ณ ๋ ๋ฒ์งธ _๋ ๋ค์ด์ค์ง ์์ undefined๊ฐ ๋ฉ๋๋ค.
pc(1, 2)
# ๊ฒฐ๊ณผ: 1 2 3
# 1๊ณผ 2๊ฐ ์์๋๋ก _, _๋ฅผ ์ฑ์๋๋ค.
pc(1, 2, 4)
# ๊ฒฐ๊ณผ: 1 2 3 4
# 1๊ณผ 2๊ฐ ์์๋๋ก _, _๋ฅผ ์ฑ์ฐ๊ณ 3์ ์ค๋ฅธ์ชฝ์ผ๋ก 4๊ฐ ๋ค์ด๊ฐ๋๋ค.
pc = _.partial(print, _, 2, _, 4)
pc(1, 3, 5)
# ๊ฒฐ๊ณผ: 1 2 3 4 5
# 1์ _ ์๋ฆฌ์ ์ฑ์ฐ๊ณ 2๋ฅผ ๋๊ฒจ์ _์ 3์ ์ฑ์ฐ๊ณ 4์ ์ค๋ฅธ์ชฝ์ 5๊ฐ ๋ค์ด๊ฐ๋๋ค.
pc = _.partial(print, _, 2, _, _, 5)
pc(1, 3, 4, 6)
# ๊ฒฐ๊ณผ: 1 2 3 4 5 6
# 1์ _ ์๋ฆฌ์ ์ฑ์ฐ๊ณ 2๋ฅผ ๋๊ฒจ์ _์ 3์ ์ฑ์ฐ๊ณ ๋ค์ _์ 4๋ฅผ ์ฑ์ฐ๊ณ 5์ ์ค๋ฅธ์ชฝ์ 6์ด ๋ค์ด๊ฐ๋๋ค.
์ค๋ฅธ์ชฝ์์๋ถํฐ ์ธ์ ์ ์ฉํด๋๊ธฐ
_.partial
์ ์คํํ๋ฉด ___
๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผํธ์ ์ธ์๋ค์ ์ผ์ชฝ๋ถํฐ ์ ์ฉํ๊ณ ์ค๋ฅธํธ์ ์ธ์๋ค์ ์ค๋ฅธ์ชฝ๋ถํฐ ์ ์ฉํ ์ค๋น๋ฅผ ํด๋ ํจ์๋ฅผ ๋ฆฌํดํฉ๋๋ค. ๋ถ๋ถ ์ ์ฉ๋ ํจ์๋ฅผ ๋์ค์ ์คํํ๋ฉด ๊ทธ๋ ๋ฐ์ ์ธ์๋ค๋ก ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ๋จผ์ ์ฑ์ด ํ, ๋จ์ ์ธ์๋ค๋ก ๊ฐ์ด๋ฐ ___
์๋ฆฌ๋ฅผ ์ฑ์๋๋ค.
pc = _.partial(print, ___, 2, 3)
pc(1)
# ๊ฒฐ๊ณผ: 1 2 3
# ___ ์๋ฆฌ์ 1์ด ๋ค์ด๊ฐ๊ณ 2, 3์ ๋งจ ์ค๋ฅธ์ชฝ์ ๋ค์ด๊ฐ๋๋ค.
pc(1, 4, 5, 6)
# ๊ฒฐ๊ณผ: 1 4 5 6 2 3
# ___ ์๋ฆฌ์ 1, 4, 5, 6์ด ๋ค์ด๊ฐ๊ณ 2, 3์ ๋งจ ์ค๋ฅธ์ชฝ์ ๋ค์ด๊ฐ๋๋ค.
pc = _.partial(print, _, 2, ___, 6)
pc(1, 3, 4, 5)
# ๊ฒฐ๊ณผ: 1 2 3 4 5 6
# _์ 1์ด ๋ค์ด๊ฐ๊ณ 2๋ฅผ ๋์ด๊ฐ๊ณ ___ ์๋ฆฌ์ 3, 4, 5๊ฐ ์ฑ์์ง๊ณ 6์ด ๋งจ ์ค๋ฅธ์ชฝ์ ๋ค์ด๊ฐ๋๋ค.
pc(1, 3, 4, 5, 7, 8, 9)
# ๊ฒฐ๊ณผ: 1 2 3 4 5 7 8 9 6
# _์ 1์ด ๋ค์ด๊ฐ๊ณ 2๋ฅผ ๋์ด๊ฐ๊ณ ___ ์๋ฆฌ์ 3, 4, 5, 7, 8, 9๊ฐ ์ฑ์์ง๊ณ 6์ด ๋งจ ์ค๋ฅธ์ชฝ์ ๋ค์ด๊ฐ๋๋ค.
pc = _.partial(print, _, 2, ___, 5, _, 7)
pc(1)
# ๊ฒฐ๊ณผ: 1 2 5 undefined 7
# _ ์๋ฆฌ์ 1์ด ๋ค์ด๊ฐ๊ณ 2์ 5์ฌ์ด๋ ์ ๋์ ์ด๋ฏ๋ก ๋ชจ์ด๊ณ 5๊ฐ ๋ค์ด๊ฐ ํ _๊ฐ undefined๋ก ๋์ฒด ๋๊ณ 7์ด ๋ค์ด๊ฐ๋๋ค.
pc(1, 3, 4)
# ๊ฒฐ๊ณผ: 1 2 3 5 4 7
# _ ์๋ฆฌ์ 1์ด ๋ค์ด๊ฐ๊ณ 2์ 5์ฌ์ด์ 3์ด ๋ค์ด๊ฐ๊ณ _ ๋ฅผ 4๋ก ์ฑ์ด ํ 7์ด ๋ค์ด๊ฐ๋๋ค.
# ์ผ์ชฝ์ _ ๋ค์ด ์ฐ์ ์์๊ฐ ์ ์ผ ๋๊ณ ___ ๋ณด๋ค ์ค๋ฅธ์ชฝ์ _ ๋ค์ด ์ฐ์ ์์๊ฐ ๋์ต๋๋ค.
pc(1, 3, 4, 6, 8)
# ๊ฒฐ๊ณผ: 1 2 3 4 6 5 8 7
# _ ์๋ฆฌ์ 1์ด ๋ค์ด๊ฐ๊ณ 2์ 5์ฌ์ด์ 3, 4, 6์ด ๋ค์ด๊ฐ๊ณ _ ๋ฅผ 8๋ก ์ฑ์ด ํ 7์ด ๋ค์ด๊ฐ๋๋ค.
๊ฐ๊ฒฐํ๊ฒ ์ฌ์ฉํ๊ธฐ
_ == _.partial
์
๋๋ค. _.partial
์ _
๋ก ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์์ต๋๋ค.
def add (a, b):
return a + b
add10 = _(add, 10)
print( add10(5) )
# 15
ํ์ดํ๋ผ์ธ
ํ์ดํ๋ผ์ธ ํจ์์ธ _.pipe
, _.go
๋ฑ์ ์์ ํจ์๋ค์ ๋ชจ์ ํฐ ํจ์๋ฅผ ๋ง๋๋ ํจ์์
๋๋ค. ํ์ดํ๋ผ์ธ์ผ๋ก ํจ์๋ฅผ ์กฐํฉํ๋ฉด ์ผ์ชฝ์์๋ถํฐ ์ค๋ฅธ์ชฝ, ์์์๋ถํฐ ์๋๋ก ํํ๋์ด ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๊ฐ ๋ฉ๋๋ค. ์ฒด์ธ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ์๋ฌด ํจ์๋ ์ฌ์ฉํ ์ ์์ด ์์ ๋๊ฐ ๋์ต๋๋ค. ์์ ํจ์๋ค์ ์ธ์์ ๊ฒฐ๊ณผ๋ง์ ์๊ฐํ๋ฉด์ ์กฐํฉํ๋ฉด ๋ฉ๋๋ค.
์ฆ์ ์คํ๊ณผ Multiple Results
_.go
๋ ํ์ดํ๋ผ์ธ์ ์ฆ์ ์คํ ๋ฒ์ ์
๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์ ๊ฐ์ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์ ํจ์์๊ฒ ๋๊ฒจ์ฃผ๊ณ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์ ํจ์์ ๊ฒฐ๊ณผ๋ ์ธ ๋ฒ์งธ ํจ์์๊ฒ ๋๊ฒจ์ฃผ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ค๊ฐ ๋ง์ง๋ง ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํด์ค๋๋ค.
_.go(10, # ์ฒซ ๋ฒ์งธ ํจ์์์ ์ฌ์ฉํ ์ธ์
lambda a: a * 10, # ์ฐ์ ์คํํ ํจ์ 1
# 100
lambda a: a - 50, # ์ฐ์ ์คํํ ํจ์ 2
# 50
lambda a: a + 10) # ์ฐ์ ์คํํ ํจ์ 3
# 60
_.go
๋ Multiple Results๋ฅผ ์ง์ํฉ๋๋ค. _.mr
ํจ์๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ค์ ํจ์์๊ฒ 2๊ฐ ์ด์์ ์ธ์๋ค์ ์ ๋ฌํ ์ ์์ต๋๋ค.
_.go(10, # ์ฒซ ๋ฒ์งธ ํจ์์์ ์ฌ์ฉํ ์ธ์
lambda a: _.mr(a * 10, 50), # ๋ ๊ฐ์ ๊ฐ์ ๋ฆฌํด
lambda a, b: a - b, # ๋ ๊ฐ์ ์ธ์ ๋ฐ๊ธฐ
lambda a: a + 10)
# 60
_.go
์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ ๋ฒ์งธ ์ธ์์ธ ํจ์๊ฐ ์ฌ์ฉํ ์ธ์๊ณ ๋ ๋ฒ์งธ ๋ถํฐ๋ ํ์ดํ๋ผ์ธ์์ ์ฌ์ฉํ ํจ์๋ค์
๋๋ค. _.go
์ ๋ ๋ฒ์งธ ์ธ์์ธ ํจ์, ์ฆ ์ต์ด ์คํ๋ ํจ์์๊ฒ 2๊ฐ ์ด์์ ์ธ์๋ฅผ ๋๊ธฐ๊ณ ์ ํ๋ค๋ฉด _.mr
์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. _.mr
๋ก ์ธ์๋ค์ ๊ฐ์ธ์ ๋๊ฒจ์ฃผ๋ฉด, ๋ค์ ํจ์๋ ์ธ์๋ฅผ ์ฌ๋ฌ ๊ฐ๋ก ํผ์ณ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
_.go(_.mr(2, 3),
lambda a, b: a + b, # 2 + 3
lambda a: a * a)
# 25
_.go
๋ฅผ ์ด๋ฏธ ์ ์๋์ด ์๋ ํจ์์ ์กฐํฉํ๋ฉด ๋์ฑ ์ฝ๊ธฐ ์ข์์ง๋๋ค.
def add(a, b):
return a + b
def square(a):
return a * a
_.go(_.mr(2, 3), add, square)
# 25
ํ์ดํ๋ผ์ธ ํจ์๋ฅผ ๋ฆฌํดํ๋ _.pipe
_.go
๊ฐ ์ฆ์ ์คํํ๋ ํ์ดํ๋ผ์ธ์ด๋ผ๋ฉด _.pipe
๋ ์คํํ ์ค๋น๊ฐ ๋ ํจ์๋ฅผ ๋ฆฌํดํ๋ ํ์ดํ๋ผ์ธ ํจ์์
๋๋ค. ๊ทธ์ธ ๋ชจ๋ ๊ธฐ๋ฅ์ _.go
์ ๋์ผํฉ๋๋ค.
f1 = _.pipe(add, square)
f1(2, 3)
# 25
๋ถ๋ถ ์ปค๋ง
์ปค๋ง์ด ๋ถ๋ถ์ ์ผ๋ก ๋์ํ๋ ํจ์
Partial.py์ ์ฃผ์ ํจ์๋ค์ ์ปค๋ง์ด ๋ถ๋ถ์ ์ผ๋ก ๋์ํ๋๋ก ์ง์ํ๊ณ ์์ต๋๋ค. ์๋๋ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ๋ชจ์ต์ ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ฐฉ์:
values = lambda data: _.map(data, lambda v, *r: v)
print(values({ 'a': 1, 'b': 2, 'c': 4 }))
# [1, 2, 4]
take3 = lambda data: _.take(data, 3)
take3([1, 2, 3, 4, 5])
# [1, 2, 3]
Partial.py์ ์ฃผ์ ํจ์๋ค์ ๋ถ๋ถ ์ปค๋ง์ด ์ ์ฉ๋์ด ์์ ๋์ผํ ๋์์ ์๋์ ๊ฐ์ด ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์์ต๋๋ค.
๋ถ๋ถ ์ปค๋ง์ด ์ง์๋ ๊ฒฝ์ฐ:
values = _.map(lambda v, *r: v)
print(values({ 'a': 1, 'b': 2, 'c': 4 }))
# [1, 2, 4]
take3 = _.take(3)
take3([1, 3, 5, 7, 9])
# [1, 3, 5]
ํ์ดํ๋ผ์ธ๊ณผ ํจ๊ป
๋ถ๋ถ ์ปค๋ง์ด ์ง์๋๋ฉด ํ์ดํ๋ผ์ธ๊ณผ ํจ๊ป ์ฌ์ฉํ ๋, ์ฒด์ธ์ฒ๋ผ ๊ฐ๊ฒฐํ ํํ์ด ๊ฐ๋ฅํฉ๋๋ค.
users = [
{ 'id': 1, 'name': 'ID', 'age': 32 },
{ 'id': 2, 'name': 'HA', 'age': 25 },
{ 'id': 3, 'name': 'BJ', 'age': 32 },
{ 'id': 4, 'name': 'PJ', 'age': 28 },
{ 'id': 5, 'name': 'JE', 'age': 27 },
{ 'id': 6, 'name': 'JM', 'age': 32 },
{ 'id': 7, 'name': 'JI', 'age': 31 }
]
## ์ผ๋ฐ์ ์ธ ์ฌ์ฉ
_.go(users,
lambda users: _.filter(users, lambda u, *r: u['age'] < 30),
lambda users: _.pluck(users, 'name'),
print)
# ['HA', 'PJ', 'JE']
## ๋ถ๋ถ ์ปค๋ง์ด ๋๋ค๋ฉด
_.go(users,
_.filter(lambda u, *r: u['age'] < 30),
_.pluck('name'),
print)
# ['HA', 'PJ', 'JE']
## Underscore.py ์ฒด์ธ
underscore\
.chain(users)\
.filter(lambda u: u['age'] < 30)\
.pluck('name')\
.tap(print)
# ['HA', 'PJ', 'JE']
_.go
, _.pipe
๋ฑ์ ํ์ดํ๋ผ์ธ์ด ๋ฐ๋ ์ฌ๋ฃ๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ ์๋ฌด ํจ์๋ ์กฐํฉํ ์ ์์ต๋๋ค. ์ฒด์ธ์ฒ๋ผ ๋ฉ์๋ ๋ฑ์ผ๋ก ์ค๋น๋์ด์์ง ์์๋ ๋๋ฉฐ Partial.py์ ํจ์๋ง ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค. Partial.py์ ํ์ดํ๋ผ์ธ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋ฌ ๊ฐ๋ก ๋ฆฌํดํ ์ ์๊ณ , ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ ์ ์๊ณ , ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ํจ์๋ , ์ง์ ๋ง๋ ํจ์๋ , ์ต๋ช
ํจ์๋ ๋ชจ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
products = [
{ 'id': 1, 'name': 'ํ๋ ์ง์
', 'discounted_price': 6000, 'price': 10000 },
{ 'id': 2, 'name': '์ฝ์ผ ํ๋ํฐ', 'discounted_price': 8000, 'price': 8000 },
{ 'id': 3, 'name': 'A1 ๋ฐํํฐ', 'discounted_price': 6000, 'price': 6000 },
{ 'id': 4, 'name': '์ฝ์ผ ๋ฐํํฐ', 'discounted_price': 5000, 'price': 6000 }
]
# ํ ์ธ ์ํ๋ค์ ๊ฐ๊ฒฉ์ด ๋ฎ์ ์์ผ๋ก ์ ๋ ฌํ ์ํ ์ด๋ฆ๋ค
_.go(products,
_.filter(lambda p, *r: p['price'] > p['discounted_price']),
_.sortBy('discounted_price'),
_.pluck('name'),
print)
# ['์ฝ์ผ ๋ฐํํฐ', 'ํ๋ ์ง์
']
# ํ ์ธ์ด ์๋ ์ํ๋ค์ id๋ค
_.go(products,
_.reject(lambda p, *r: p['price'] > p['discounted_price']),
_.pluck('id'),
print)
# [2, 3]
# ํ ์ธ ์ํ ์ค ํ ์ธ์ก์ด ๊ฐ์ฅ ๋ฎ์ ์ํ์ ์ด๋ฆ
_.go(products,
_.filter(lambda p, *r: p['price'] > p['discounted_price']),
_.min(lambda p, *r: p['price'] - p['discounted_price']),
_.val('name'),
print)
# ์ฝ์ผ ๋ฐํํฐ
# ํ ์ธ์ก์ด ๊ฐ์ฅ ๋์ ์ํ์ ์ด๋ฆ
_.go(products,
_.max(lambda p, *r: p['price'] - p['discounted_price']),
_.val('name'),
print)
# ํ๋ ์ง์
๋น๋๊ธฐ
async
, await
ํค์๋์ Partial.py๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ค์ํ ๋น๋๊ธฐ ์ํฉ์ ๊ฐ๋จํ ์ ์ดํ ์ ์์ต๋๋ค.
ํ์ดํ๋ผ์ธ์ผ๋ก ๋น๋๊ธฐ ์ ์ด ํ๊ธฐ
_.asy
๋ฅผ ๋ค์์คํ์ด์ค๋ก ๊ฐ๋ _.asy.go
, _.asy.pipe
๋ฑ์ ํ์ดํ๋ผ์ธ ํจ์๋ค์ ๋น๋๊ธฐ ์ ์ด๋ฅผ ์ง์ํฉ๋๋ค.
await ํค์๋์ ํจ๊ป ์ฌ์ฉ:
async def asy_add(val, *r):
await asyncio.sleep(1)
return val + 10
## await ํค์๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ๋ก ์คํํ๋ _.go.asy
await _.asy.go(10,
asy_add,
print)
# 20
## _.asy.pipe๋ก ๋น๋๊ธฐ ํจ์์ ๋๊ธฐ ํจ์ ์กฐํฉํด ๋ง๋ ์๋ก์ด ํจ์
asy_pipe = _.asy.pipe(asy_add, print)
await asy_pipe(10)
# 20
## _.pipe๋ ๋น๋๊ธฐ ํจ์๋ฅผ ๋ง๋๋ฉด ์๋์ผ๋ก _.asy.pipe๊ฐ ๋ฉ๋๋ค.
asy_pipe = _.pipe(asy_add, print)
await asy_pipe(10)
# 20
์ปฌ๋ ์ ์ ๋ค๋ฃจ๋ ๋น๋๊ธฐ ์ ์ด ํจ์
Partial.py์ _.each
, _.map
, _.reduce
๋ฑ์ ์ฃผ์ ํจ์๋ค์ _.asy.go
์ _.asy.pipe
์ฒ๋ผ ๋๊ธฐ์ ๋น๋๊ธฐ ์ํฉ์ด ๋ชจ๋ ๋์๋๋๋ก ๋์ด ์์ต๋๋ค. Partial.py์ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋น๋๊ธฐ ์ํฉ์์๋ ๋๊ธฐ ์ํฉ๊ณผ ๋์ผํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ณ , ๋น๋๊ธฐ ํจ์์ ๋๊ธฐ ํจ์์ ์กฐํฉ๋ ๊ฐ๋ฅํฉ๋๋ค.
async def asyncDate(*r):
await asyncio.sleep(1)
return datetime.datetime.now()
def syncDate(*r):
return datetime.datetime.now()
_.go(
[1, 2, 3],
_.map(syncDate),
_.map(lambda now, *r: now.strftime('%Y-%m-%d %H:%M:%S')),
print)
# ['2017-06-16 12:34:39', '2017-06-16 12:34:39', '2017-06-16 12:34:39']
await _.asy.go(
[1, 2, 3],
_.map(asyncDate),
_.map(lambda now, *r: now.strftime('%Y-%m-%d %H:%M:%S')),
print)
# ['2017-06-16 12:34:39', '2017-06-16 12:34:39', '2017-06-16 12:34:39']
์ ์ฌ๋ก์ฒ๋ผ Partial.py๋ _.pipe
, _.each
, _.map
, _.find
, _.filter
, _.reject
, _.reduce
, _.some
, _.every
๋ฑ์ ํจ์๋ค์์ ์๋ ๋น๋๊ธฐ ์ ์ด ๋ก์ง์ ์ง์ํฉ๋๋ค.
์ง์ฐ ํ๊ฐ L
Partial.py์ L
์ ์ด์ฉํ๋ฉด, ํ์ดํ๋ผ์ธ ๋ด๋ถ์์ ํจ์๋ค์ ์คํ ์์๋ฅผ ์ฌ๋ฐฐ์นํ์ฌ ์ ์ ํ๊ฒ ํ๊ฐ๋ฅผ ์ง์ฐํฉ๋๋ค. ์ฌ์ฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค. Partial.py์์ L
์ import
ํ๋ฉด ๋ฉ๋๋ค. L
์ ํตํด ์ง์ฐ ํ๊ฐํ ์์ญ์ ๋ช
์์ ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค. _.go, _.pipe
๋ฑ์ ํ์ดํ๋ผ์ธ์ด L
๋ก ์์ํ์ฌ L
๋ก ๋๋ ๋๊น์ง์ ํจ์๋ค์ ์ฌ๋ฐฐ์นํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํฉ๋๋ค.
๋น๊ต
์๊ฒฉํ ํ๊ฐ:
list = [1, 2, 3, 4, 5, 6]
_.go(list,
_.map(lambda v, *r: v * v), # 6๋ฒ
_.filter(lambda v, *r: v < 20), # 6๋ฒ
_.take(2),
print)
# [1, 4]
# ์ด 12๋ฒ
์ง์ฐ ํ๊ฐ:
list = [1, 2, 3, 4, 5, 6]
_.go(list,
L.map(lambda v, *r: v * v), # 2๋ฒ
L.filter(lambda v, *r: v < 20), # 2๋ฒ
L.take(2),
print)
# [1, 4]
# ์ด 4๋ฒ
์ง์ ํจ์๋ค
Partial.js์ ์ง์ฐ ํ๊ฐ ์ง์ ํจ์๋ก๋ L.map
, L.filter
, L.reject
, L.find
, L.some
, L.every
, L.take
๊ฐ ์์ต๋๋ค. ์ด ํจ์๋ค์ ์์๋๋ก ๋์ดํ๋ฉด ํ์ดํ๋ผ์ธ์ด ํ๊ฐ ์์ ์ ๋ณ๊ฒฝํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ํฉ ๋ฑ์์ ๋์ํฉ๋๋ค.
- map->map->map
- map->take
- filter->take
- map->filter->take
- map->filter->map->map
- map->filter->map->take
- map->reject->map->map->filter->map
- map->some
- map->every
- map->find
- map->filter->some
- map->filter->every
- map->filter->find
- filter->map->some
- filter->map->every
- filter->map->reject->find
์ง์ฐ ํ๊ฐ๋ฅผ ์์์ํค๊ณ ์ ์ง ์ํค๋ ํจ์๋ map
, filter
, reject
์ด๊ณ ๋์ ๋ด๋ ํจ์๋ take
, some
, every
, find
, ์
๋๋ค.
users = [
{ 'id': 1, 'name': 'ID', 'age': 12 },
{ 'id': 2, 'name': 'BJ', 'age': 28 },
{ 'id': 3, 'name': 'HA', 'age': 13 },
{ 'id': 4, 'name': 'PJ', 'age': 23 },
{ 'id': 5, 'name': 'JE', 'age': 29 },
{ 'id': 6, 'name': 'JM', 'age': 32 },
{ 'id': 7, 'name': 'JE', 'age': 31 },
{ 'id': 8, 'name': 'HI', 'age': 15 },
{ 'id': 9, 'name': 'HO', 'age': 28 },
{ 'id': 10, 'name': 'KO', 'age': 34 }
]
# 10๋ 2๋ช
๊น์ง๋ง ์ฐพ์๋ด๊ธฐ
_.go(users,
L.filter(lambda user, *r : user['age'] < 20),
L.take(2),
print)
# [{ 'id': 1, 'name': 'ID', 'age': 12 }, { 'id': 3, 'name': 'HA', 'age': 13 }]
# 3๋ฒ๋ง ๋ฐ๋ณต
# 10๋ 2๋ช
๊น์ง๋ง ์ฐพ์๋ด์ ์ด๋ฆ ์์งํ๊ธฐ
_.go(users,
L.filter(lambda user, *r : user['age'] < 20),
L.map(lambda v, *r : v['name']),
L.take(2),
print)
# ['ID', 'HA']
# 3๋ฒ๋ง ๋ฐ๋ณต
L.strict
L.strict
๋ฅผ ์ด์ฉํ์ฌ ์ง์ฐ ํ๊ฐ๋ฅผ ๋์์ํฌ ๊ฒ์ธ๊ฐ๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์ซ์๋ก ํ๊ธฐ:
strict_or_lazy1 = __(
_.range,
L.strict(100),
L.map(lambda v, *r: v * v),
L.filter(lambda v, *r: _.bool(v % 2)),
L.take(10),
print)
strict_or_lazy1(50)
# [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
# 50 ๋ฒ ๋ฐ๋ณต (์ผ๊ฒฉ)
strict_or_lazy1(100)
# [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
# 20 ๋ฒ ๋ฐ๋ณต (์ง์ฐ)
strict_or_lazy1(15)
# [1, 9, 25, 49, 81, 121, 169]
# 15 ๋ฒ ๋ฐ๋ณต (์๊ฒฉ)
ํจ์๋ก ํ๊ธฐ:
strict_or_lazy2 = __(
_.range,
L.strict(lambda list, *r : len(list) < 100),
L.map(lambda v, *r : v * v),
L.filter(lambda v, *r : bool(v % 2)),
L.take(10),
print)
strict_or_lazy2(50)
# [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
# 50 ๋ฒ ๋ฐ๋ณต (์ผ๊ฒฉ)
strict_or_lazy2(100)
# [1, 9, 25, 49, 81, 121, 169, 225, 289, 361]
# 20 ๋ฒ ๋ฐ๋ณต (์ง์ฐ)
strict_or_lazy2(15)
# [1, 9, 25, 49, 81, 121, 169]
# 15 ๋ฒ ๋ฐ๋ณต (์๊ฒฉ)