๐Ÿ“ˆํŒŒ์ด์ฌ ์‹ฌํ™”( signature, partial)

ํŒ”๋ฆฌ๋™ยท2021๋…„ 5์›” 6์ผ
0

๐Ÿ“ˆํŒŒ์ด์ฌ ์‹ฌํ™”( signature, partial)

signature

  • ์ด์ „ ํฌ์ŠคํŠธ์— ์‚ฌ์šฉํ•œ args_testํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
def args_test(name, *contents, point=None, **attrs):
    return '<args_test> -> ({}) ({}) ({}) ({})'.format(name, contents, point, attrs)
  • inspect ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ signature๋กœ ์ธ์ž์— ๋Œ€ํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
from inspect import signature

sg = signature(args_test)
print(sg)
# (name, *contents, point=None, **attrs)
print(sg.parameters)
# OrderedDict([('name', <Parameter "name">), ('contents', <Parameter "*contents">), ('point', <Parameter "point=None">), ('attrs', <Parameter "**attrs">)])
  • signature ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํ•จ์ˆ˜์˜ ์ธ์ž ํƒ€์ž…์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

โญ๏ธpartial

partial ์‚ฌ์šฉ๋ฒ• : ์ธ์ˆ˜ ๊ณ ์ • -> ์ฃผ๋กœ ํŠน์ • ์ธ์ˆ˜ ๊ณ ์ • ํ›„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ์‚ฌ์šฉ
ํ•˜๋‚˜ ์ด์ƒ์˜ ์ธ์ˆ˜๊ฐ€ ์ด๋ฏธ ํ• ๋‹น๋œ(์ฑ„์›Œ์ง„) ํ•จ์ˆ˜์˜ ์ƒˆ ๋ฒ„์ „ ๋ฐ˜ํ™˜
ํ•จ์ˆ˜์˜ ์ƒˆ ๊ฐ์ฒด ํƒ€์ž…์€ ์ด์ „ ํ•จ์ˆ˜์˜ ์ž์ฒด๋ฅผ ๊ธฐ์ˆ ํ•˜๊ณ  ์žˆ๋‹ค.

์ฝ”๋“œ๋กœ ์ดํ•ดํ•ด๋ณด์ž

from operator import mul
from functools import partial
  • operator ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ mulํ•จ์ˆ˜๋ฅผ๋ฝ‘๊ณ 
  • functools ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ partialํ•จ์ˆ˜๋ฅผ ๋ฝ‘์•˜๋‹ค.
print(mul(5,100)) 
# 500
  • mul ํ•จ์ˆ˜๋Š” ์ธ์ž๋ฅผ 2๊ฐœ๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ  ๊ฐ ์ธ์ž๋ฅผ ๊ณฑํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋‹ค.
five = partial(mul,5)

#partial ํ•จ์ˆ˜๋กœ mulํ•จ์ˆ˜์˜ ์ธ์ž 1๊ฐœ๋ฅผ ๊ณ ์ •ํ•œ๋‹ค.

print(five(1000))
# 5000
  • five=(partial(mul,5))์ธ์ž ํ•˜๋‚˜๊ฐ€ ์ด๋ฏธ 5๋กœ ๊ณ ์ •๋˜์–ด์žˆ๊ธฐ์— ์ธ์ž๋กœ 1000 ํ•˜๋‚˜๋งŒ ๋„ฃ๋Š”๋‹ค.
  • ๋งŒ์•ฝ ์ธ์ž๋ฅผ 2๊ฐœ๋„ฃ์œผ๋ฉด ex.five(1000,10) ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.

#๊ณ ์ • ์ถ”๊ฐ€

six = partial(five,6)
print(six())
# 30 
  • six ๋ผ๋Š” ๋ณ€์ˆ˜์— partialํ•จ์ˆ˜๋ฅผ ์จ์„œ five(mulํ•จ์ˆ˜์— ์ธ์žํ•˜๋‚˜(5)๋ฅผ ๊ณ ์ •ํ•œ)ํ•จ์ˆ˜์— 6์„ ๊ณ ์ •ํ•œ๋‹ค.
  • six()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 30 ์ด๋‹ค. ์ด๋ฏธ ์ธ์ž๊ฐ€ 5 6 ์œผ๋กœ ์ •ํ•ด์กŒ๊ธฐ ๋•Œ๋ฌธ
  • ๋งŒ์•ฝ six(5)๊ฐ™์ด ์ธ์ž๋ฅผ ๋„ฃ์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค. ์ด๋ฏธ ์ธ์ž๊ฐ€ ๊ฝ‰์ฐผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

#์‘์šฉ

print([five(i) for i in range(1,11)]) # [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
print(list(map(five, range(1,11)))) # [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]

์ •๋ฆฌ: partialํ•จ์ˆ˜๋Š” ์ธ์ž๋ฅผ ๊ณ ์ •ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€๋•Œ ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.

profile
๋ฐฐ์›€์˜ ๊ธฐ๋ก

0๊ฐœ์˜ ๋Œ“๊ธ€