Смысл упаковки ключевых аргументов в python 3?
Да много где приходится использовать. Первое что вспоминается:Если одна функция является оберткой над другой функцией, реализация которой может меняться, то обертка принимает **kwargs и передает в оборачиваемую функцию, при этом может происходит изменение/добавление/удаление элементов словаря, т.е. параметров оборачиваемой функции.Написание декораторов - обобщение случая №1, когда оборачивается не конкретная функция, вызываемая по имени, а переменная.Часто используется в различных ORM, когда через параметры функции передаются значения полей модели/записи БД (сама ORM не имеет понятия о конкретной модели/таблице).Не уверен насчет того, насколько это правильный паттерн проектирования, но любую функцию принимающую словарь единственным аргументом можно переписать так,  чтобы она принимала **kwargs, это дает возможность более удобной передачи аргументов f(var=42), вместо создания словаря на лету f({'var': 42}), и оставляет возможность передать готовый словарь через вызов с распаковкой аргументов f(**the_dict).
могут понадобиться когда у вас данные пришли снаружи, например из конфиг-файла.import json

def foo(host, port):
    ....

with open('config.json', 'r') as f:
    config = json.loads(f.read())

    foo(config['host'], config['port'])  # можно так
    foo(**config)  # или так