๐Ÿ ๋‚ด๊ฐ€ ๋ณด๋ ค๊ณ  ์ž‘์„ฑํ•œ *args, **kwargs, ๊ทธ๋ฆฌ๊ณ  **vars(args) ํŒŒ์ด์ฌ ํ•จ์ˆ˜ ์ธ์ž ์ •๋ฆฌ

์„œ์ฟ ยท2025๋…„ 7์›” 1์ผ
1

today-snippets

๋ชฉ๋ก ๋ณด๊ธฐ
6/6

๐Ÿ‘‹ ๋“ค์–ด๊ฐ€๋ฉฐ

Python์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋‹ค ๋ณด๋ฉด ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋„˜๊ฒจ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ž์ฃผ ์ƒ๊น๋‹ˆ๋‹ค.

ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์ฃ :

  • ์ธ์ž์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์„œ ์ผ์ผ์ด ์“ฐ๊ธฐ ๊ท€์ฐฎ์„ ๋•Œ
  • argparse๋กœ ํŒŒ์‹ฑํ•œ ์ปค๋งจ๋“œ๋ผ์ธ ์ธ์ž๋ฅผ ํ•จ์ˆ˜์— ๋„˜๊ธฐ๊ณ  ์‹ถ์„ ๋•Œ
  • ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ข‹์€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ

์ด๋Ÿด ๋•Œ args, kwargs, vars(args)๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊น”๋”ํ•˜๊ณ  ํŒŒ์›Œํ’€ํ•ด์ง‘๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์˜ค๋žซ๋™์•ˆ ์•ˆ ์“ฐ๋‹ค๋ณด๋ฉด ์ข…์ข… ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด, ์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ํ†ตํ•ด ์ด ์„ธ ๊ฐ€์ง€ ๊ฐœ๋…์„ ์‹ค์ œ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์ž์„ธํžˆ ๋ณต์Šตํ•˜๋ฉฐ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿงฑ ๊ธฐ๋ณธ ๊ฐœ๋… ์ •๋ฆฌ

(์ฐธ๊ณ ) ์œ„์น˜ ์ธ์ž (Positional Argument)๋ž€?

โœ… ์ •์˜

ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜(parameter)์— ์ˆœ์„œ๋Œ€๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ์ธ์ž๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ์ธ์ž์˜ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ , ์œ„์น˜์— ๋”ฐ๋ผ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ’์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜ ์ •์˜์—์„œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹ ์˜ˆ์ œ

def greet(name, age):
    print(f"My name is {name} and Iโ€™m {age} years old.")

greet("Alice", 30)  # โœ… ์œ„์น˜ ์ธ์ž ์‚ฌ์šฉ
  • "Alice" โ†’ ์ฒซ ๋ฒˆ์งธ ์œ„์น˜ ์ธ์ž โ†’ name
  • 30 โ†’ ๋‘ ๋ฒˆ์งธ ์œ„์น˜ ์ธ์ž โ†’ age

1๏ธโƒฃ *args: ์œ„์น˜ ์ธ์ž๋ฅผ ํŠœํ”Œ๋กœ ๋ฐ›๊ธฐ

def arg_func(*args):
    return(print(args)) 
    
arg_func(1, 2, 3)
# ์ถœ๋ ฅ:
# (1, 2, 3)
  • ๊ฐ’๋งŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹ โ†’ ์œ„์น˜ ์ธ์ž(Positional Argument)
  • *args๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์œ„์น˜ ์ธ์ž๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ํŠœํ”Œ(tuple)๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ args = (1, 2, 3)์ด ๋ฉ๋‹ˆ๋‹ค.
def print_args(*args):
    for arg in args:
        print(arg)

print_args(1, 2, 3)
# ์ถœ๋ ฅ:
# 1
# 2
# 3
  • *args๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์œ„์น˜ ์ธ์ž๋ฅผ ํ•˜๋‚˜์˜ ํŠœํ”Œ๋กœ ๋ฌถ์–ด์ค๋‹ˆ๋‹ค.
  • ์ด๋ฆ„์€ ๊ผญ args์ผ ํ•„์š”๋Š” ์—†์ง€๋งŒ, ๊ด€๋ก€์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

(์ฐธ๊ณ ) ํ‚ค์›Œ๋“œ ์ธ์ž (Keyword Argument)๋ž€?

โœ… ์ •์˜

๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜์—ฌ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ์ธ์ž์ž…๋‹ˆ๋‹ค.

  • ์ธ์ž ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, ์ด๋ฆ„ ๊ธฐ์ค€์œผ๋กœ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹ ์˜ˆ์ œ

greet(age=30, name="Alice")  # โœ… ํ‚ค์›Œ๋“œ ์ธ์ž ์‚ฌ์šฉ
  • age=30 โ†’ age ๋งค๊ฐœ๋ณ€์ˆ˜(ํ‚ค์›Œ๋“œ ์ธ์ž)๋กœ ์ง์ ‘ ์ „๋‹ฌ๋จ
  • name="Alice" โ†’ name ๋งค๊ฐœ๋ณ€์ˆ˜(ํ‚ค์›Œ๋“œ ์ธ์ž)๋กœ ์ง์ ‘ ์ „๋‹ฌ๋จ
  • ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์ „ํ˜€ ๋ฌธ์ œ ์—†์Œ!

2๏ธโƒฃ **kwargs: ํ‚ค์›Œ๋“œ ์ธ์ž๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ›๊ธฐ

def kwarg_func(**kwargs):
    return(print(kwargs))    
    
kwarg_func(a=1, b=2, c=3)

# ์ถœ๋ ฅ:
# {'a': 1, 'b': 2, 'c': 3}
  • ์ด๋ฆ„=๊ฐ’ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹ โ†’ ํ‚ค์›Œ๋“œ ์ธ์ž(Keyword Argument)
  • **kwargs๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค์›Œ๋“œ ์ธ์ž๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ๋Š” ๋”•์…”๋„ˆ๋ฆฌ(dict) ํ˜•ํƒœ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ kwargs = {'a': 1, 'b': 2, 'c': 3}๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
def print_kwargs(**kwargs):
    for key, value in kwargs.items():
        print(f"{key} = {value}")

print_kwargs(name="Alice", age=30)

# ์ถœ๋ ฅ:
# name = Alice
# age = 30
  • **kwargs๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค์›Œ๋“œ ์ธ์ž๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฌถ์–ด์ค๋‹ˆ๋‹ค.
  • ์ฆ‰, key=value ํ˜•์‹์˜ ์ธ์ž๋“ค์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌ

๊ตฌ๋ถ„์˜์–ด ๋ช…์นญ์ „๋‹ฌ ํ˜•์‹์ˆœ์„œ ์ค‘์š” ์—ฌ๋ถ€ํ•จ์ˆ˜ ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ์˜ˆ์‹œ
์œ„์น˜ ์ธ์žPositional Argument๊ฐ’๋งŒโœ… ์ค‘์š”*args โ†’ tuplearg_func(1, 2, 3)
ํ‚ค์›Œ๋“œ ์ธ์žKeyword Argumentkey=value ํ˜•์‹โŒ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ**kwargs โ†’ dictkwarg_func(a=1, b=2, c=3)

์˜ˆ์ œ 1.

def greet(name, age):
    print(f"Hello, I'm {name} and I'm {age} years old.")

info = ("Alice", 30)
greet(*info)  # ์œ„์น˜ ์–ธํŒจํ‚น

data = {"name": "Alice", "age": 30}
greet(**data)  # ํ‚ค์›Œ๋“œ ์–ธํŒจํ‚น

โœ… ํ•ต์‹ฌ: *๋Š” ํŠœํ”Œ โ†’ ์œ„์น˜ ์ธ์ž, **๋Š” ๋”•์…”๋„ˆ๋ฆฌ โ†’ ํ‚ค์›Œ๋“œ ์ธ์ž๋กœ ๋ณ€ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.

์˜ˆ์ œ 2.


def foo(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

foo(1, 2, 3, a=10, b=20)

# ์ถœ๋ ฅ: 
# args: (1, 2, 3)
# kwargs: {'a': 10, 'b': 20}
  • ์•ž์˜ 1, 2, 3 โ†’ ์œ„์น˜ ์ธ์ž๋‹ˆ๊นŒ ์ „๋ถ€ args = (1, 2, 3)
  • ๋’ค์˜ a=10, b=20 โ†’ ํ‚ค์›Œ๋“œ ์ธ์ž๋‹ˆ๊นŒ ์ „๋ถ€ kwargs = {'a':10, 'b':20}

-> ์ด๊ฑธ "์•Œ์•„์„œ" ํ•ด์ฃผ๋Š” ๊ฒŒ Python์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ž๋™ ์–ธํŒจํ‚น ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.


๐Ÿ’ป ์‹ค์ „ ์˜ˆ์ œ: argparse + **vars(args)

๋‹ค์Œ์€ ์ปค๋งจ๋“œ๋ผ์ธ์—์„œ ์ธ์ž๋ฅผ ๋ฐ›์•„ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

๐Ÿ“„ ์˜ˆ์‹œ ์Šคํฌ๋ฆฝํŠธ: generate_series.py

import argparse

def generate_time_series_with_anomalies(num_points, 
										anomaly_rate, 
                                        anomaly_range,
                                        anomaly_length,
                                        freq, amp, slope):
	(์ค‘๋žต ...)
    
    return [], []

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--num_points', type=int, default=1000)
    parser.add_argument('--anomaly_rate', type=float, default=0.01)
    parser.add_argument('--anomaly_range', type=eval, default=(2, 3))
    parser.add_argument('--anomaly_length', type=int, default=6)
    parser.add_argument('--freq', type=int, default=20)
    parser.add_argument('--amp', type=float, default=0.4)
    parser.add_argument('--slope', type=float, default=0.0)

    args = parser.parse_args()

    # ๐Ÿ’ก ํ•ต์‹ฌ ํฌ์ธํŠธ: args๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์–ธํŒจํ‚น
    generate_time_series_with_anomalies(**vars(args))

โœ… ์™œ **vars(args)๊ฐ€ ์œ ์šฉํ• ๊นŒ?

  • argparse๋Š” args๋ผ๋Š” Namespace ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • vars(args)๋Š” ์ด Namespace ๊ฐ์ฒด๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • **vars(args)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ํ•จ์ˆ˜์— ์–ธํŒจํ‚นํ•˜๋ฉด ๊ฐ ํ‚ค์›Œ๋“œ๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงช ์‹ค์Šตํ•ด๋ณด๊ธฐ

์œ„์ฒ˜๋Ÿผ ์ปค๋งจ๋“œ๋ผ์ธ์—์„œ ์˜ต์…˜์„ ์ฃผ๋ฉด ์ž๋™์œผ๋กœ ํ•จ์ˆ˜ ์ธ์ž์— ๋งคํ•‘๋˜์–ด ๋„˜๊ฒจ์ง‘๋‹ˆ๋‹ค.


๐Ÿง  ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

๊ฐœ๋…์„ค๋ช…
*args์—ฌ๋Ÿฌ ๊ฐœ์˜ ์œ„์น˜ ์ธ์ž๋ฅผ ํŠœํ”Œ๋กœ ๋ฐ›์Œ
**kwargs์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ‚ค์›Œ๋“œ ์ธ์ž๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ›์Œ
*ํŠœํ”Œ์„ ์œ„์น˜ ์ธ์ž๋กœ ์–ธํŒจํ‚น
**๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ํ‚ค์›Œ๋“œ ์ธ์ž๋กœ ์–ธํŒจํ‚น
vars(args)Namespace โ†’ dict ๋ณ€ํ™˜ (argparse์™€ ํ•จ๊ป˜ ์ž์ฃผ ์‚ฌ์šฉ๋จ)

๐Ÿช„ ์‹ค๋ฌด ํŒ

  • argparse๋ฅผ ์“ธ ๋• **vars(args) ํŒจํ„ด์„ ์ ๊ทน ํ™œ์šฉํ•˜์„ธ์š”.
  • ํ•จ์ˆ˜์— ์ธ์ž๊ฐ€ ๋งŽ๊ฑฐ๋‚˜, ๊ฐ€๋ณ€์ ์ธ ๊ฒฝ์šฐ **kwargs๋ฅผ ํ•จ์ˆ˜ ์ •์˜์— ํฌํ•จ์‹œํ‚ค๋ฉด ์œ ์ง€๋ณด์ˆ˜์— ๋งค์šฐ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ•„์š”ํ•˜๋‹ค๋ฉด def func(a, b, **kwargs):์ฒ˜๋Ÿผ ๊ณ ์ • ์ธ์ž + ๊ฐ€๋ณ€ ์ธ์ž๋ฅผ ํ˜ผ์šฉํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค.
profile
Always be passionate โœจ

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