Add deserialize method to Trigger base class and annotate classes dict#596
Merged
gnachman merged 2 commits intognachman:masterfrom Mar 2, 2026
Merged
Conversation
The classes dict in decode_trigger was inferred as dict[str, type] by mypy, causing "type has no attribute deserialize" error. Add a type annotation and a base class deserialize method to fix this.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Added a
deserializestatic method to theTriggerbase class and a type annotation to theclassesdict indecode_trigger, so that mypy can verify theclasses[name].deserialize(...)call.Background
decode_trigger()builds a dict mapping trigger names to subclasses, then calls.deserialize()on the looked-up classtype(without the annotation) ortype[Trigger](with the annotation), neither of which has adeserializeattributetypetotype[Trigger], and the base class method ensurestype[Trigger]hasdeserializedeserializeis always called on a concrete subclass, but the base class definition is required for static type checkingAlternatives considered
Annotating the dict value type as a
Unionof all 27 subclass types (e.g.Union[Type[AlertTrigger], Type[AnnotateTrigger], ...]) would make the base class method unnecessary, since each subclass already definesdeserialize. However, this would be verbose and harder to maintain as new trigger types are added.Verification
Confirmed that
mypy --ignore-missing-imports iterm2/triggers.pyno longer reports"type" has no attribute "deserialize" [attr-defined]orReturning Any [no-any-return]on line 81.