๐ํ์ด์ฌ ์ฌํ(callable,*args **kwargs)
๐ํ์ด์ฌ ์ฌํ(callable,*args **kwargs)
Callable
- ๋ก๋ ๋ฒํธ๋ฅผ ์ถ๋ ฅํด์ฃผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
import random
class LottoGame:
def __init__(self):
self._balls = [n for n in range(1,46)]
def pick(self):
random.shuffle(self._balls)
return sorted([random.choice(self._balls) for n in range(6)])
-
๊ฐ์ฒด๋ฅผ ์์ฑํด์ค๋ค. game = LottoGame()
-
์คํ ํ์ธ
print(game.pick()) # [9, 10, 35, 38, 44, 44]
print(game()) # TypeError: 'LottoGame' object is not callable
-
๊ฐ์ฒด๋ฅผ ๋ด์ ๋ณ์์ pick()๋ฅผ ํธ์ถ ํ๋ฉด ๋์ง๋ง ๋ณ์์ () ๋ฅผ ๋ถ์ฌ์ ํธ์ถ์ ํ๋ฉด ์๋ฌ๊ฐ๋๋ค.
-
callable()ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๋ฅผ ์ ์๋์ง ์๋์ง ์๋ ค์ค๋ค.
print(callable(str), callable(list), callable(3.14), callable(game))
# True True False False
- 3.14 ๊ฐ์ ์ซ์์ ์์์ ์ ์ํ game ๊ฐ์ ๋ณ์ ๊ฐ์ฒด๋ ํธ์ถํ ์ ์๋ค.
- ์ด๊ฒ์ ํธ์ถ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ ....
class LottoGame:
def __init__(self):
self._balls = [n for n in range(1,46)]
def pick(self):
random.shuffle(self._balls)
return sorted([random.choice(self._balls) for n in range(6)])
def __call__(self):
return self.pick()
def __call__(self):
call๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ฉด ๊ฐ๋ฅํ๋ค
print(callable(game)) # True
print(game()) # [3, 11, 12, 14, 32, 36]
- callableํจ์๋ฅผ ํตํด game์ ์ฐ์ด๋ณด๋ฉด True๊ฐ ๋์ค๊ณ
- ํด๋์ค๋ฅผ ๋ด์ ๊ฐ์ฒด
game
์ ํธ์ถํด๋ ๊ฐ๋ฅํ๋ค
๋ค์ํ ๋งค๊ฐ๋ณ์ ์
๋ ฅ(*args, **kwargs)
- ๋งค๊ฐ๋ณ์๋ฅผ ์
๋ ฅํ๋ ๋ถ๋ถ์ด ์ดํด๊ฐ์๊ฐ ์์ธํ ์๋ฅผ ๋ค์ด๋ณด๊ฒ ๋ค.
def args_test(name, *contents, point=None, **attrs):
return '<args_test> -> ({}) ({}) ({}) ({})'.format(name, contents, point, attrs)
import random
class LottoGame:
def __init__(self):
self._balls = [n for n in range(1,46)]
def pick(self):
random.shuffle(self._balls)
return sorted([random.choice(self._balls) for n in range(6)])
๊ฐ์ฒด๋ฅผ ์์ฑํด์ค๋ค. game = LottoGame()
์คํ ํ์ธ
print(game.pick()) # [9, 10, 35, 38, 44, 44]
print(game()) # TypeError: 'LottoGame' object is not callable
๊ฐ์ฒด๋ฅผ ๋ด์ ๋ณ์์ pick()๋ฅผ ํธ์ถ ํ๋ฉด ๋์ง๋ง ๋ณ์์ () ๋ฅผ ๋ถ์ฌ์ ํธ์ถ์ ํ๋ฉด ์๋ฌ๊ฐ๋๋ค.
callable()ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๋ฅผ ์ ์๋์ง ์๋์ง ์๋ ค์ค๋ค.
print(callable(str), callable(list), callable(3.14), callable(game))
# True True False False
class LottoGame:
def __init__(self):
self._balls = [n for n in range(1,46)]
def pick(self):
random.shuffle(self._balls)
return sorted([random.choice(self._balls) for n in range(6)])
def __call__(self):
return self.pick()
def __call__(self):
call๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ฉด ๊ฐ๋ฅํ๋ค print(callable(game)) # True
print(game()) # [3, 11, 12, 14, 32, 36]
game
์ ํธ์ถํด๋ ๊ฐ๋ฅํ๋คdef args_test(name, *contents, point=None, **attrs):
return '<args_test> -> ({}) ({}) ({}) ({})'.format(name, contents, point, attrs)
1. ์ธ์ 1๊ฐ๋ง ์คฌ์ ๋
print(args_test('test1'))
# (test1) (()) (None) ({})
2. ์ธ์๋ฅผ 2๊ฐ ์คฌ์ ๋
- name์ test1์ด ๋ค์ด๊ฐ๋ค. 2๋ฒ์งธ๋ ํํํํ์ ๋น๊ณ 3๋ฒ๋๋ point๋ฅผ ํ ๋น์ ์ํ๊ธฐ ๋๋ฌธ์ None์ด๊ณ 4๋ฒ์งธ๋ dict ํํ์ ๋น์ด์๋ค.
print(args_test('test1', 'test2'))
# (test1) (('test2',)) (None) ({})
- name ์ test1์ด ๋ค์ด๊ฐ๊ณ test2๋ ํํ ํํ๋ก ๋ค์ด๊ฐ๋ค. ์ดํ ๋์ผ
3. ์ธ์ 3๊ฐ, dict 1๊ฐ
print(args_test('test1','test2', 'test3', id='admin'))
# (test1) (('test2', 'test3')) (None) ({'id': 'admin'})
- name์ test1 2๋ฒ์งธ ํญ๋ชฉ์ ํํ๋ก test2, test3๊ฐ ๋ค์ด๊ฐ๊ณ 3๋ฒ์งธ๋ ๋์ผํ๊ณ 4๋ฒ์งธ์ ๋๋์ด dictํํ๋ก id:admin์ด ๋ค์ด๊ฐ๋ค.
4. + ์ง์ ๊ฐ
print(args_test('test1','test2', 'test3', id='admin', point=7))
# (test1) (('test2', 'test3')) (7) ({'id': 'admin'})
- point=7 ๊ฐ์ ์ง์ ํ๋๋ 3๋ฒ์งธ ํญ๋ชฉ์ 7์ด ์๊ฒผ๋ค.
์ด์ ์ฅ๊ณ ๊ฐ๋ฐํ ๋ ํจ์์ *args **kwargs ์ ์ดํดํ๋๋ก ํ์
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ํ์ด์ฌ ์ฌํ(callable,*args **kwargs)), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@sdk1926/ํ์ด์ฌ-์ฌํhigher-order-function์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค