Skip to content

Bug: APIGatewayHttpResolver fails with ValueError: [TypeError('cannot convert dictionary update sequence element #0 to a sequence'), TypeError('vars() argument must have __dict__ attribute')] #4300

Closed
@toddcooke

Description

@toddcooke

Expected Behaviour

I expect the APIGatewayHttpResolver to route my request to the proper annotated function, eg:

@app.get("/something")
def something():
    # does something...

Current Behaviour

For some requests, I get the error ValueError: [TypeError('cannot convert dictionary update sequence element #0 to a sequence'), TypeError('vars() argument must have __dict__ attribute')]

I'm using the serverless framework to package and deploy my app. I'm also using the serverless-python-requirements plugin to package my app.

See attached snippet for full traceback.

Code snippet

ANY /teams (λ: handler)
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/openapi/encoders.py", line 272, in _dump_other
backend-1  |
    data = dict(obj)
           ^^^^^^^^^
TypeError: cannot convert dictionary update sequence element #0 to a sequence
backend-1  |
During handling of the above exception, another exception occurred:
backend-1  |
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/openapi/encoders.py", line 276, in _dump_other
    data = vars(obj)
           ^^^^^^^^^
TypeError: vars() argument must have __dict__ attribute
backend-1  |
The above exception was the direct cause of the following exception:
backend-1  |
Traceback (most recent call last):
  File "/app/node_modules/serverless-offline/src/lambda/handler-runner/python-runner/invoke.py", line 97, in <module>
backend-1  |
    result = handler(input['event'], context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/tracing/tracer.py", line 317, in decorate
    response = lambda_handler(event, context, **kwargs)
               ^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/app/handlers.py", line 192, in handler
    return app.resolve(event, context)
           ^^^^^^^^^^^^^^^^^^^
^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/api_gateway.py", line 1918, in resolve
backend-1  |
    response = self._resolve().build(self.current_event, self._cors)
               ^^^^^^^^^^^^^^
^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/api_gateway.py", line 2025, in _resolve
backend-1  |
    return self._call_route(route, route_keys)  # pass fn args
backend-1  |
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/api_gateway.py", line 2103, in _call_route
backend-1  |
    route(router_middlewares=self._router_middlewares, app=self, route_arguments=route_arguments),
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/api_gateway.py", line 407, in __call__
backend-1  |
    return self._middleware_stack(app)
backend-1  |
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/api_gateway.py", line 1314, in __call__
backend-1  |
    return self.current_middleware(app, self.next_middleware)
backend-1  |
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/middlewares/base.py", line 121, in __call__
    return self.handler(app, next_middleware)
backend-1  |
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py", line 133, in handler
    return self._handle_response(route=route, response=response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py", line 140, in _handle_response
    response.body = self._serialize_response(
                    ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/middlewares/openapi_validation.py", line 200, in _serialize_response
    return jsonable_encoder(response_content, custom_serializer=self._validation_serializer)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/openapi/encoders.py", line 122, in jsonable_encoder
backend-1  |
    return _dump_sequence(
           ^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/openapi/encoders.py", line 245, in _dump_sequence
    jsonable_encoder(
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/openapi/encoders.py", line 145, in jsonable_encoder
    return _dump_other(
           ^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/aws_lambda_powertools/event_handler/openapi/encoders.py", line 279, in _dump_other
    raise ValueError(errors) from e
ValueError: [TypeError('cannot convert dictionary update sequence element #0 to a sequence'), TypeError('vars() argument must have __dict__ attribute')]


### Possible Solution

_No response_

### Steps to Reproduce

My project is not easy to reproduce locally and I can't share it publicly, but I would be OK with sharing my screen or sending certain files privately to powertools-lambda-python contributors.

### Powertools for AWS Lambda (Python) version

latest

### AWS Lambda function runtime

3.11

### Packaging format used

PyPi

### Debugging logs

_No response_

Metadata

Metadata

Type

No type

Projects

Status

Shipped

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions