Skip to content

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

Closed
@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

    Projects

    Status

    Shipped

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions