A Coding Implementation on Pyright Type Checking Covering Generics, Protocols, Strict Mode, Type Narrowing, and Modern Python Typing


print("=" * 62)
print("SECTION 9 · pyrightconfig.json")
print("=" * 62)


config = {
   "include": ["src"],
   "exclude": ["**/__pycache__"],
   "pythonVersion": "3.11",
   "typeCheckingMode": "strict",
   "reportMissingImports": "error",
   "reportMissingTypeStubs": "warning",
   "reportUnknownVariableType": "warning",
   "reportUnknownMemberType": "warning",
   "reportUnnecessaryTypeIgnoreComment": "warning",
}
cfg_path = os.path.join(WORK, "pyrightconfig.json")
with open(cfg_path, "w") as f:
   json.dump(config, f, indent=2)
print(f"Written: {cfg_path}")
print(json.dumps(config, indent=2))
print()


print("=" * 62)
print("SECTION 10 · Self, TypeAlias, NewType")
print("=" * 62)


write("s10_modern_types.py", """
   from typing import Self, TypeAlias, NewType


   class Query:
       def __init__(self) -> None:
           self._filters: list[str] = []


       def where(self, cond: str) -> Self:
           self._filters.append(cond)
           return self


       def build(self) -> str:
           return " AND ".join(self._filters)


   class AdvancedQuery(Query):
       def order_by(self, col: str) -> Self:
           return self


   q = AdvancedQuery().where("age > 18").order_by("name")
   reveal_type(q)


   Vector: TypeAlias = list[float]
   Matrix: TypeAlias = list[Vector]


   def dot(a: Vector, b: Vector) -> float:
       return sum(x * y for x, y in zip(a, b))


   v1: Vector = [1.0, 2.0, 3.0]
   v2: Vector = [4.0, 5.0, 6.0]
   dot(v1, v2)
   dot(v1, [1, 2, 3])


   UserId   = NewType("UserId", int)
   OrderId  = NewType("OrderId", int)


   def get_user(uid: UserId) -> str:
       return f"user_{uid}"


   uid = UserId(42)
   oid = OrderId(99)


   get_user(uid)
   get_user(oid)
   get_user(42)
""")


print("→ s10_modern_types.py:")
run_pyright("s10_modern_types.py")


print("=" * 62)
print("SECTION 11 · reveal_type() & type: ignore")
print("=" * 62)


write("s11_reveal_ignore.py", """
   from typing import Any


   values = [1, "two", 3.0]
   reveal_type(values)


   def mystery(x: Any) -> Any:
       return x


   r = mystery(42)
   reveal_type(r)


   bad: int = "oops"
   bad2: int = "also bad"  # type: ignore[assignment]
""")


print("→ s11_reveal_ignore.py:")
run_pyright("s11_reveal_ignore.py")


print("=" * 62)
print("TUTORIAL COMPLETE")
print("=" * 62)
print("""
Topics covered
──────────────
1  Basic annotations & inference
2  Optional / Union / PEP 604 syntax
3  Type narrowing (isinstance, guards, TypeGuard, match)
4  Generics — TypeVar, Generic, ParamSpec
5  Protocols & structural subtyping
6  TypedDict, dataclasses, NamedTuple
7  Literal, Final, @overload
8  Strict mode
9  pyrightconfig.json
10  Self, TypeAlias, NewType
11  reveal_type() & type: ignore


All source files written to: /tmp/pyright_tutorial/
""")



Source link

  • Related Posts

    IBM Releases Two Granite Speech 4.1 2B Models: Autoregressive ASR with Translation and Non-Autoregressive Editing for Fast Inference

    IBM released two new open speech recognition models— Granite Speech 4.1 2B and Granite Speech 4.1 2B-NAR — and they make a compelling case for what a ~2B-parameter speech model…

    Cursor Introduces a TypeScript SDK for Building Programmatic Coding Agents With Sandboxed Cloud VMs, Subagents, Hooks, and Token-Based Pricing

    Cursor, the AI-powered code editor, is opening up the core technology behind its coding agents to developers everywhere. The Cursor team announced the public beta of the Cursor SDK —…

    Leave a Reply

    Your email address will not be published. Required fields are marked *