Skip to content

prefer-match-type-dispatch

Prefer match for structural runtime type dispatch.

Why

A long mutually exclusive isinstance dispatch repeats its subject and hides the closed list of runtime shapes. Class patterns make the alternatives explicit without repeating the dispatch subject.

Fix

Replace the branches with match subject and one class-pattern arm per distinct type; combine types that share behavior with an OR-pattern.

Examples

Before — flagged Repeated branches dispatch on runtime type
app/parser.py
def parse(value: object):
if isinstance(value, str):
return parse_text(value)
elif isinstance(value, bytes):
return parse_bytes(value)
elif isinstance(value, dict):
return parse_mapping(value)
raise TypeError(type(value))
After — preferred Class patterns make the type dispatch explicit
app/parser.py
def parse(value: object):
match value:
case str():
return parse_text(value)
case bytes():
return parse_bytes(value)
case dict():
return parse_mapping(value)
case _:
raise TypeError(type(value))
Before — flagged Two isinstance returns project one AST identifier shape
app/ast_names.py
import ast
def dotted_tail(node: ast.expr) -> str | None:
if isinstance(node, ast.Name):
return node.id
if isinstance(node, ast.Attribute):
return node.attr
return None
After — preferred Class patterns expose the two AST identifier shapes
app/ast_names.py
import ast
def dotted_tail(node: ast.expr) -> str | None:
match node:
case ast.Name():
return node.id
case ast.Attribute():
return node.attr
case _:
return None