Skip to content

Support keyword-only operation inputs and nested dictionaries - #932

Open
jonathan343 wants to merge 4 commits into
developfrom
feat/keyword-inputs
Open

jonathan343 wants to merge 4 commits into
developfrom
feat/keyword-inputs

Conversation

@jonathan343

Copy link
Copy Markdown
Contributor

Summary

This PR changes generated sync and async client operations to accept input members as keyword-only parameters instead of requiring an input object. This makes simple calls shorter while still allowing complete request dictionaries to be passed with **request.

Nested structures and unions accept dictionaries, generated models, or a mix of both, including within lists and maps. Existing nested models are validated and reused without modification, so compatible values from a response can be passed into another request.

The generated API includes precise types for these inputs, with Params dictionary types for reusable requests and member documentation directly on operation parameters. Invalid input structure, such as unknown dictionary keys, missing required members, or malformed unions, raises a TypeError with the path to the problem before client setup or sending a request. Interceptors continue to receive an input model.

Example

Before

await client.assume_role(
    AssumeRoleInput(
        role_arn=role_arn,
        role_session_name="example",
        tags=[Tag(key="team", value="platform")],
    )
)

After

await client.assume_role(
    role_arn=role_arn,
    role_session_name="example",
    tags=[{"key": "team", "value": "platform"}],
)

Generated models remain supported for nested values:

request: AssumeRoleInputParams = {
    "role_arn": role_arn,
    "role_session_name": "example",
    "tags": [Tag(key="team", value="platform")],
}

await client.assume_role(**request)

Compatibility

This replaces the positional input-object calling convention. Required members become required keyword parameters. For keyword and dictionary inputs, None is treated as omission, allowing modeled defaults to apply. Operations without input members can be called without arguments.

Input members named self or plugins are escaped to avoid conflicts with the client method's own parameters. Generated clients and the supporting runtime packages must be updated together.


By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

Expose operation input members as keyword-only arguments and normalize
nested dictionaries without mutating caller data. Generate typed request
dictionaries and update protocol fixtures for the new interface.
@jonathan343
jonathan343 marked this pull request as ready for review November 12, 2026 16:21
@jonathan343
jonathan343 requested a review from a team as a code owner November 12, 2026 16:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant