Skip to content

Feature request: Return empty Dict or List in Event Source Data Classes instead of None #2605

@ericbn

Description

@ericbn

Use case

Arguably, it might be easier for users if an empty Dict is returned instead of None for path_parameters in APIGatewayProxyEventV2, for example.

Instead of:

@event_source(data_class=APIGatewayProxyEventV2)
def lambda_handler(event: APIGatewayProxyEventV2, context) -> None:
    parameters = event.path_parameters or {}
    handle(parameters["id"])

it would become:

@event_source(data_class=APIGatewayProxyEventV2)
def lambda_handler(event: APIGatewayProxyEventV2, context) -> None:
    handle(event.path_parameters["id"])

Ultimately this approach could be followed for any return value that is either an Optional[Dict] or an Optional[List], returning an empty Dict or List instead of None in all cases:

  • utilities/data_classes/api_gateway_proxy_event.py
    • APIGatewayEventAuthorizer
      • def claims(self) -> Dict[str, Any]
      • def scopes(self) -> List[str]
    • APIGatewayProxyEvent
      • def multi_value_query_string_parameters(self) -> Dict[str, List[str]]
      • def path_parameters(self) -> Dict[str, str]
      • def stage_variables(self) -> Dict[str, str]
    • RequestContextV2AuthorizerIam
      • def cognito_amr(self) -> List[str]
    • RequestContextV2Authorizer
      • def jwt_claim(self) -> Dict[str, Any]
      • def jwt_scopes(self) -> List[str]
      • def get_lambda(self) -> Dict[str, Any]
    • APIGatewayProxyEventV2
      • def cookies(self) -> List[str]
      • def path_parameters(self) -> Dict[str, str]
      • def stage_variables(self) -> Dict[str, str]

and so on...

The bottom line is: Does it matter for users to differentiate between None and an empty Dict or List for any Event Source Data Classe property? If it does for a particular one, it an exception to a rule or the rule?

This change would be backwards compatible with the previous code.

This approach was already implemented in only one place so far, as far as I could check:

  • utilities/data_classes/common.py
    • BaseProxyEvent
      • def headers(self) -> Dict[str, str]

Solution/User Experience

Solution can be the same as for the headers in the BaseProxyEvent:

@property
def headers(self) -> Dict[str, str]:
return self.get("headers") or {}

Alternative solutions

No response

Acknowledgment

Metadata

Metadata

Assignees

No one assigned

    Labels

    breaking-changeBreaking changefeature-requestfeature requesthelp wantedCould use a second pair of eyes/handsneed-customer-feedbackRequires more customers feedback before making or revisiting a decisionneed-rfcrevisitMaintainer to provide update or revisit prioritization in the next cyclev3Features that will be included in Powertools v3.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status

    Shipped

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions