chore: 批量优化代码与配置,完善类型注解

This commit is contained in:
2026-06-21 10:04:01 +08:00
parent 56c018e72e
commit 60083bcb6e
17 changed files with 351 additions and 357 deletions
+3 -3
View File
@@ -47,7 +47,7 @@ def _is_context_annotation(annotation: Any) -> bool:
def build_call_args(
spec: TaskSpec[object],
spec: TaskSpec[Any],
context: Mapping[str, Any],
) -> tuple[tuple[Any, ...], dict[str, Any]]:
"""解析用于调用 ``spec.fn`` 的 ``(args, kwargs)``。
@@ -92,7 +92,7 @@ def build_call_args(
raise InjectionError(
spec.name,
f"static kwargs {sorted(collisions)} collide with dependency names; "
"rename the static kwarg or the dependency.",
+ "rename the static kwarg or the dependency.",
)
injected_kwargs: dict[str, Any] = {}
@@ -155,7 +155,7 @@ def build_call_args(
return tuple(spec.args), injected_kwargs
def describe_injection(spec: TaskSpec[object]) -> str:
def describe_injection(spec: TaskSpec[Any]) -> str:
"""生成任务参数注入方式的人类可读描述。
供 ``dry_run`` 使用,在不执行的情况下展示执行计划。
+1 -1
View File
@@ -35,7 +35,7 @@ def main() -> None:
# Static positional args parameterise the same function twice.
px.TaskSpec("fetch_user", fetch_user, args=(1,)),
px.TaskSpec("fetch_posts", fetch_posts, args=(1,)),
px.TaskSpec("aggregate", aggregate, ("fetch_user", "fetch_posts")),
px.TaskSpec("aggregate", aggregate, depends_on=("fetch_user", "fetch_posts")),
]
)
+4 -2
View File
@@ -55,10 +55,12 @@ def main() -> None:
px.TaskSpec(
"transform",
transform,
("extract_customers", "extract_orders"),
depends_on=("extract_customers", "extract_orders"),
tags=("transform",),
),
px.TaskSpec("load", load, ("transform",), retries=1, tags=("load",)),
px.TaskSpec(
"load", load, depends_on=("transform",), retries=1, tags=("load",)
),
]
)
+1 -1
View File
@@ -33,7 +33,7 @@ def main() -> None:
[
px.TaskSpec("fetch_a", fetch_a),
px.TaskSpec("fetch_b", fetch_b),
px.TaskSpec("merge", merge, ("fetch_a", "fetch_b")),
px.TaskSpec("merge", merge, depends_on=("fetch_a", "fetch_b")),
]
)
+7 -6
View File
@@ -28,6 +28,7 @@ from typing import Sequence
from .errors import PyFlowXError
from .executors import Strategy, normalize_strategy, run
from .graph import Graph
from .task import TaskSpec
__all__ = ["CliExitCode", "CliRunner"]
@@ -58,7 +59,7 @@ def _apply_verbose_to_graph(graph: Graph, verbose: bool) -> Graph:
Graph
所有 spec 的 verbose 字段已更新的新图.
"""
new_specs = []
new_specs: list[TaskSpec[object]] = []
for spec in graph.all_specs().values():
if spec.verbose == verbose:
new_specs.append(spec)
@@ -191,28 +192,28 @@ class CliRunner:
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=self._format_commands_help(),
)
parser.add_argument(
_ = parser.add_argument(
"command",
nargs="?",
help="要执行的命令",
)
parser.add_argument(
_ = parser.add_argument(
"--strategy",
choices=[s.value for s in Strategy],
default=self._strategy.value,
help="执行策略 (默认: %(default)s)",
)
parser.add_argument(
_ = parser.add_argument(
"--dry-run",
action="store_true",
help="只打印执行计划, 不实际运行",
)
parser.add_argument(
_ = parser.add_argument(
"--list",
action="store_true",
help="列出所有可用命令",
)
parser.add_argument(
_ = parser.add_argument(
"--quiet",
action="store_true",
help="静默模式, 不显示执行过程 (覆盖默认 verbose)",
+5 -4
View File
@@ -99,7 +99,8 @@ class JSONBackend(StateBackend):
try:
with open(tmp, "w", encoding="utf-8") as fh:
json.dump(self._store, fh, ensure_ascii=False, indent=2)
Path(tmp).replace(Path(self._path))
_ = Path(tmp).replace(Path(self._path))
except (OSError, TypeError) as exc:
raise StorageError(f"cannot write state file {self._path!r}", exc) from exc
@@ -109,13 +110,13 @@ class JSONBackend(StateBackend):
def save(self, name: str, value: Any) -> None:
# 在修改内存状态前先校验可序列化性。
try:
json.dumps(value)
_ = json.dumps(value)
except (TypeError, ValueError) as exc:
raise StorageError(
f"result of task {name!r} is not JSON-serialisable", exc
) from exc
self._store[name] = value
_ = self._flush()
self._flush()
def has(self, name: str) -> bool:
return name in self._store
@@ -125,7 +126,7 @@ class JSONBackend(StateBackend):
def clear(self) -> None:
self._store.clear()
_ = self._flush()
self._flush()
def resolve_backend(backend: StateBackend | None) -> StateBackend:
+1
View File
@@ -150,6 +150,7 @@ class TaskSpec(Generic[T]):
return self._wrap_cmd()
if self.fn is not None:
return self.fn
raise ValueError(f"TaskSpec '{self.name}': 没有可执行的函数或命令。")
def _wrap_cmd(self) -> TaskFn[Any]: