В чем разница между ** kwargs и dict в Python 3.2?

Похоже, что многие аспекты python - это всего лишь дубликаты функциональности. Есть ли какая-то разница за пределами избыточности, которую я вижу в kwargs и dict внутри Python?

Ответ 1

Существует различие в распаковке аргументов (где многие используют kwargs) и передают dict в качестве одного из аргументов:

  • Использование распаковки аргументов:

    # Prepare function
    def test(**kwargs):
        return kwargs
    
    # Invoke function
    >>> test(a=10, b=20)
    {'a':10,'b':20}
    
  • Передача dict в качестве аргумента:

    # Prepare function
    def test(my_dict):
        return my_dict
    
    # Invoke function
    >>> test(dict(a=10, b=20))
    {'a':10,'b':20}
    

Различия в основном:

  • (вы можете просто передавать аргументы ключевого слова, даже если они явно не определены),
  • гибкость (вы можете напрямую поддерживать некоторые аргументы ключевого слова, а остальные - **kwargs), Распаковка аргументов
  • помогает избежать непредвиденных изменений в объекте, содержащем "аргументы" (что менее важно, поскольку Python в целом предполагает, что разработчики знают, что они делают, это другая тема),

Ответ 2

Правильно, что в большинстве случаев вы можете просто обменивать dicts и ** kwargs.

Например:

my_dict = {'a': 5, 'b': 6}
def printer1(adict):
    return adict
def printer2(**kwargs):
    return kwargs

#evaluate:
>>> printer1(my_dict)
{'a': 5, 'b': 6}
>>> printer2(**my_dict)
{'a': 5, 'b': 6}

Однако с помощью kwargs у вас больше гибкости, если вы объедините его с другими аргументами:

def printer3(a, b=0, **kwargs):
    return a,b,kwargs

#evaluate
>>> printer3(**my_dict)
(5, 6, {})