Skip to content

Commit b504068

Browse files
committed
Remove hasattr
1 parent e97bd19 commit b504068

2 files changed

Lines changed: 23 additions & 21 deletions

File tree

lib/zephyr/src/zephyr/execution.py

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
PhysicalOp,
4646
PhysicalPlan,
4747
Scatter,
48+
Shard,
4849
SourceItem,
4950
StageContext,
5051
StageType,
@@ -56,23 +57,6 @@
5657
logger = logging.getLogger(__name__)
5758

5859

59-
# ---------------------------------------------------------------------------
60-
# Shard protocol and implementations
61-
# ---------------------------------------------------------------------------
62-
63-
64-
class Shard(Protocol):
65-
"""Protocol for a shard of data assigned to a single worker.
66-
67-
Implementations:
68-
- ListShard: backed by iterable references (source data, non-scatter)
69-
- ScatterShard: backed by scatter Parquet files with predicate pushdown
70-
"""
71-
72-
def __iter__(self) -> Iterator: ...
73-
def get_iterators(self) -> Iterator[Iterator]: ...
74-
75-
7660
@dataclass(frozen=True)
7761
class PickleDiskChunk:
7862
"""Reference to a pickle chunk stored on disk.

lib/zephyr/src/zephyr/plan.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from dataclasses import dataclass, field
2020
from enum import StrEnum, auto
2121
from itertools import groupby, islice
22-
from typing import Any
22+
from typing import Any, Protocol
2323

2424
import msgspec
2525
from iris.env_resources import TaskResources as _TaskResources
@@ -51,6 +51,23 @@
5151
logger = logging.getLogger(__name__)
5252

5353

54+
# ---------------------------------------------------------------------------
55+
# Shard protocol
56+
# ---------------------------------------------------------------------------
57+
58+
59+
class Shard(Protocol):
60+
"""Protocol for a shard of data assigned to a single worker.
61+
62+
Implementations:
63+
- ListShard: backed by iterable references (source data, non-scatter)
64+
- ScatterShard: backed by scatter Parquet files with predicate pushdown
65+
"""
66+
67+
def __iter__(self) -> Iterator: ...
68+
def get_iterators(self) -> Iterator[Iterator]: ...
69+
70+
5471
@dataclass
5572
class SourceItem:
5673
"""A source item with its shard assignment.
@@ -568,7 +585,7 @@ def make_windows(
568585

569586

570587
def _merge_sorted_chunks(
571-
shard, key_fn: Callable, sort_fn: Callable | None = None, external_sort_dir: str | None = None
588+
shard: Shard, key_fn: Callable, sort_fn: Callable | None = None, external_sort_dir: str | None = None
572589
) -> Iterator[tuple[object, Iterator]]:
573590
"""Merge sorted chunks using k-way merge, yielding (key, items_iterator) groups.
574591
@@ -598,10 +615,11 @@ def merge_key(item):
598615

599616
# Check if external sort is needed BEFORE materializing all iterators.
600617
# ScatterShard can decide using manifest stats (no file opens needed).
618+
from zephyr.shuffle import ScatterShard
619+
601620
use_external = (
602621
external_sort_dir is not None
603-
and hasattr(shard, "needs_external_sort")
604-
and hasattr(shard, "get_iterators")
622+
and isinstance(shard, ScatterShard)
605623
and shard.needs_external_sort(_TaskResources.from_environment().memory_bytes)
606624
)
607625

0 commit comments

Comments
 (0)