Problem
Luigi master added type annotations to Task.input(), Task.output(), and Task.requires(). This causes mypy to report [override] errors in TaskOnKart:
gokart/task.py: error: Return type "FlattenableItems[TargetOnKart]" of "input" incompatible with return type "Target | list[Target] | dict[str, Target]" in supertype "Task" [override]
gokart/task.py: error: Return type "FlattenableItems[TargetOnKart]" of "output" incompatible with return type "Target | list[Target] | dict[str, Target]" in supertype "Task" [override]
gokart/task.py: error: Return type "FlattenableItems[TaskOnKart[Any]]" of "requires" incompatible with return type "Task | list[Task] | dict[str, Task]" in supertype "Task" [override]
Root Cause
Luigi defines return types as T | list[T] | dict[str, T], while gokart uses FlattenableItems[T]:
FlattenableItems: TypeAlias = T | list['FlattenableItems[T]'] | tuple['FlattenableItems[T]', ...] | dict[str, 'FlattenableItems[T]']
Two differences make FlattenableItems[T] incompatible as a subtype of luigi's type:
- Includes tuple — not present in luigi's type
- Recursively nested — e.g.
list[list[T]] is valid, but luigi only allows list[T]
The concrete type parameters (TargetOnKart <: Target, TaskOnKart <: Task) are fine (covariant direction).
Options
- Suppress with
# type: ignore[override] — simplest; no runtime issue exists
- Narrow FlattenableItems to match luigi — would need to audit all usages for tuple/nested patterns
- Propose widening luigi's return types — upstream PR to support tuple and recursive nesting
- Combination: suppress now, propose upstream change later
Discussion
Which approach should we take?
Problem
Luigi master added type annotations to Task.input(), Task.output(), and Task.requires(). This causes mypy to report [override] errors in TaskOnKart:
Root Cause
Luigi defines return types as
T | list[T] | dict[str, T], while gokart uses FlattenableItems[T]:FlattenableItems:
TypeAlias = T | list['FlattenableItems[T]'] | tuple['FlattenableItems[T]', ...] | dict[str, 'FlattenableItems[T]']Two differences make
FlattenableItems[T]incompatible as a subtype of luigi's type:list[list[T]]is valid, but luigi only allowslist[T]The concrete type parameters (
TargetOnKart <: Target, TaskOnKart <: Task) are fine (covariant direction).Options
# type: ignore[override]— simplest; no runtime issue existsDiscussion
Which approach should we take?