Безымянный позиционный аргумент для метода Python kwargs

Я использую метод Flask-RESTful abort() при построении ошибки ответ в REST. В приведенном примере есть именованный аргумент message

def abort_if_todo_doesnt_exist(todo_id):
    if todo_id not in TODOS:
        abort(404, message="Todo {} doesn't exist".format(todo_id))

Выход

{
    "message": "Todo asd doesn't exist. You have requested this URI [/todos/asd] but did you mean /todos/<todo_id> or /todos ?"
}

В моем сценарии у меня уже есть собственный тип исключения

class InvalidParameter(Exception):
    status_code = 400

    def __init__(self, message, status_code=None, resource=None,
                field=None, code=None, stack_trace=None):
        Exception.__init__(self)
        self.message = message
        if status_code is not None:
            self.status_code = status_code
        self.resource = resource
        self.field = field
        self.code = code
        self.stack_trace = stack_trace

    def to_dict(self):
        rv = {}
        error = {}
        rv['message'] = self.message
        error['resource'] = self.resource
        error['field'] = self.field
        error['code'] = self.code
        error['stack_trace'] = self.stack_trace
        rv['error'] = error
        return rv

и конкретная структура ответа JSON для ошибок:

{
    "message": "Project name 'GGO' already exist.",
    "error": {
        "resource": "Project",
        "field": "project_name",
        "code": "already_exists",
        "stack_trace": "(psycopg2.IntegrityError) duplicate key value violates unique ..."
    }
}

Код проблемы

Я должен использовать два именованных аргумента

except InvalidParameter as err:
    abort(err.status_code, 
                message=err.to_dict()['message'], 
                error=err.to_dict()['error'])

Когда я использую это, кроме InvalidParameter как err: abort(err.status_code, err.to_dict())

я получаю ошибку

TypeError: abort() takes 1 positional argument but 2 were given // Werkzeug Debugger

Как я могу передать весь err dict в качестве параметра?


person Hanxue    schedule 22.08.2017    source источник
comment
Согласно исходному коду, abort занимает только 1 позиционный аргумент (http_status_code) вместе с любым количеством kwargs. Вот почему он ошибается с TypeError, когда вы передаете 2 позиционных аргумента. Вы можете использовать распаковку dict **dict, чтобы передать все ключевые аргументы из вашей переменной err - abort(err.status_code, **err)   -  person shad0w_wa1k3r    schedule 22.08.2017
comment
Спасибо @AshishNitinPatil, это решение. Вы хотите официально ответить, прежде чем я свяжу этот вопрос как дубликат?   -  person Hanxue    schedule 22.08.2017
comment
Я уже ответил на него, но отвечать на обман не рекомендуется, поэтому я удалил свой ответ. Вы должны закрыть это как обман.   -  person shad0w_wa1k3r    schedule 22.08.2017