πŸ“ˆνŒŒμ΄μ¬ 심화(callable,*args **kwargs)

νŒ”λ¦¬λ™Β·2021λ…„ 5μ›” 6일
0

πŸ”’νŒŒμ΄μ¬ 심화(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)

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 잘 μ΄ν•΄ν•˜λ„λ‘ ν•˜μž

profile
λ°°μ›€μ˜ 기둝

0개의 λŒ“κΈ€