args and kwargs
kwargs는 키워드된 n개의 변수들을 함수의 인자로 보낼 때 사용한다. (args 키워드되지않은 n개의 변수)
나 **는 패킹, 언패킹과도 관련이 있는데 위처럼 리스트나 딕셔너리 앞에 쓰면 언패킹, 흩어져있는 값들을 args, **kwagrs로 묶는 다면 패킹이라고 한다.
(아마) OOP에서 자주 사용하는데, 이렇게 하면 함수를 오버라이딩할 때, original function의 arugments들을 갯수에 상관없이 전부 다 부를 수 있음.
args랑 kwargs를 _랑 *_없이 사용할 수는 없음. 그리고 굳이 이름 저렇게 안 붙여도 됨 그냥 컨벤션임.
(“kwargs” means “keyword arguments”)
def print_value(A, B, C):
value = "{}/{}/{}".format(A, B, C)
print(value)
args = (1, 2, 3)
kwargs = {"A": 5, "B": 11, "C": 99}
print_value(*args) # 1/2/3
print_value(**kwagrs) # 5/11/99
django 모델에서의 kwargs
Example 1
# Model
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=20)
def __str__(self):
return self.title
# Admin
from .models import Book
kwargs = {'title': 'AAA', 'name': 'Seul'}
Book.objects.create(**kwargs)
Book.objects.filter(**kwargs)
Example 2
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def save(self, *args, **kwargs):
do_something()
super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.
do_something_else()
- *args - list of unnamed arguments
- **kwargs - dictionary (named arguments)
따라서…
save(1,2,3,4,a=20,b=30,c=40)
- *args: (1, 2, 3, 4)
- **kwargs: {‘a’:20,’b’:30,’c’:40}
Example3
def foo(a, b, c, d):
print a, b, c, d
l = [0, 1]
d = {"d":3, "c":2}
foo(*l, **d)
prink: 0 1 2 3
Example4
def print_keyword_args(**kwargs): … # kwargs is a dict of the keyword args passed to the function … for key, value in kwargs.iteritems(): … print “%s = %s” % (key, value) … print_keyword_args(first_name=”John”, last_name=”Doe”) first_name = John last_name = Doe