๐Ÿ“ Type Hints โ€“ Best Practices๏ƒ

ืžื˜ืจื”: ืœืฉืžืจ ื‘ื˜ื™ื—ื•ืช ื˜ื™ืคื•ืกื™ื ื‘ืจื•ืจื”, ืœื”ืงืฉื™ื— ืžื•ื“ื•ืœื™ื ื‘ื”ื“ืจื’ื”, ื•ืœื ืœื”ืกืชืžืš ืขืœ type: ignore.


ืืกื˜ืจื˜ื’ื™ื”: ื”ืงืฉื—ื” ื”ื“ืจื’ืชื™ืช๏ƒ

  • ื”ืชื—ื™ืœื• ืžืžื•ื“ื•ืœื™ื ืžืจื›ื–ื™ื™ื (DB, Web) ื•ื”ื•ืกื™ืคื• ื˜ื™ืคื•ืกื™ื ื‘ืจื•ืจื™ื ืœืคื•ื ืงืฆื™ื•ืช ืฆื™ื‘ื•ืจื™ื•ืช.

  • ื˜ืคืœื• ื‘ืื–ื”ืจื•ืช MyPy ื ืงื•ื“ืชื™ืช ื‘ืžืงื•ื type: ignore ื’ื•ืจืฃ.


ืคืจื•ื˜ื•ืงื•ืœื™ื ื•ืกื˜ืื‘ื™ื๏ƒ

  • ืœืคืจื™ื˜ื™ื ืžืžืฉืงื™ึพื”ืคืขืœื” (ืœืžืฉืœ ืื•ืกืฃ Mongo) โ€“ ื”ื’ื“ื™ืจื• Protocol ื›ื“ื™ ืœืืคืฉืจ ื”ื—ืœืคื”/ืžื•ืงื™ื ื’ ื‘ื˜ืกื˜ื™ื.

from typing import Protocol, Any, Optional

class CollectionLike(Protocol):
    def find_one(self, query: dict[str, Any]) -> Optional[dict[str, Any]]: ...
    def insert_one(self, doc: dict[str, Any]) -> Any: ...
  • ืขื‘ื•ืจ ObjectId/BSON โ€“ ื”ื™ืžื ืขื• ืžืชืœื•ืช ืงืฉื”; ื”ืขื“ื™ืคื• ื˜ื™ืคื•ืกื™ื ื›ืœืœื™ื™ื ืขื ื•ืœื™ื“ืฆื™ื” ื‘ืงื•ื“.

ื“ื•ื’ืžืื•ืช ืžื”ืงื•ื“๏ƒ

  • ื‘ืคืจื•ื™ืงื˜ ืงื™ื™ืžื™ื ืคืจื•ื˜ื•ืงื•ืœื™ื ื•ืžืžืฉืงื™ ื’ื™ืฉื” ืขืงื‘ื™ื™ื ื‘ืžื•ื“ื•ืœื™ื DB, ืœืžืฉืœ ื‘โ€‘database/manager.py ื ืฉืขื ื™ื ืขืœ ื—ืชื™ืžื•ืช ื‘ืจื•ืจื•ืช ืœืื™ื ื“ืงืกื™ื ื•ืœืคืขื•ืœื•ืช CRUD. ื”ื”ืงืฉื—ื” ื”ื”ื“ืจื’ืชื™ืช ืžืฉืžืจืช ืชืื™ืžื•ืช ื˜ืกื˜ื™ื.

ื”ื’ื“ืจื•ืช MyPy๏ƒ

  • ื”ืงื•ื‘ืฅ mypy.ini ืžื—ืžื™ืจ ืžื•ื“ื•ืœื™ื ืžืกื•ื™ืžื™ื (ืœืžืฉืœ services.code_service) ื•ืžืืคืฉืจ ื”ื—ืžืจื” ื”ื“ืจื’ืชื™ืช.

  • ืžื•ืžืœืฅ ืœื”ื•ืกื™ืฃ ืžื•ื“ื•ืœื™ื ืขื disallow_untyped_defs = True ื‘ื”ื“ืจื’ื”, ื•ื‘ืžืงื‘ื™ืœ ืœืฆืžืฆื ignore_missing_imports ื›ืืฉืจ ืืคืฉืจ.

ืžืกืœื•ืœ ืžื™ื’ืจืฆื™ื”๏ƒ

  1. ื”ื•ืกื™ืคื• ื˜ื™ืคื•ืกื™ื ืœืคื•ื ืงืฆื™ื•ืช ืฆื™ื‘ื•ืจื™ื•ืช.

  2. ืคื™ืจืงื• ื‘ื™ื˜ื•ื™ื™ื ืžื•ืจื›ื‘ื™ื ืœืžืฉืชื ื™ื ืžืชื•ึผื’ื™ื.

  3. ื”ื—ืœื™ืคื• Any ื‘ื˜ื™ืคื•ืกื™ื ืžื“ื•ื™ืงื™ื ื™ื•ืชืจ ื›ืืฉืจ ื™ืฉ ืื™ื ื•ื•ืืจื™ืื ื˜ ื‘ืจื•ืจ.


ื”ื ื—ื™ื•ืช ืœืกื•ื›ื ื™ื๏ƒ

  • ืืœ ืชืฉื ื• ื—ืชื™ืžื•ืช ืงื™ื™ืžื•ืช ืœืœื ืฆื•ืจืš (ืฉื‘ืจ ืชืื™ืžื•ืช).

  • ื”ื™ืžื ืขื• ืž-type: ignore; ื‘ืžืงื•ื ื–ื”:

    • ืคื™ืจื•ืง ื‘ื™ื˜ื•ื™ื™ื ืžื•ืจื›ื‘ื™ื ืœืžืฉืชื ื™ื ืžืชื•ึผื’ื™ื

    • ืฉื™ืžื•ืฉ ื‘-cast ืžืžื•ืงื“ ืจืง ื›ืฉื™ืฉ ืื™ื ื•ื•ืืจื™ืื ื˜ ื‘ืจื•ืจ

  • ื”ืฉืชืžืฉื• ื‘-Optional[T] ื›ืฉืขืจืš ืขืœื•ืœ ืœื”ื™ื•ืช None.

  • typing.Any โ€“ ืฉื™ืžื•ืฉ ืžื‘ื•ืงืจ ื‘ืœื‘ื“, ื›ื ืงื•ื“ืช ืงืฆื” API ืื• ืฆื“ ืฉืœื™ืฉื™.


ื“ื•ื’ืžืื•ืช ืงืฆืจื•ืช๏ƒ

from typing import Optional

def get_username(user_id: int) -> Optional[str]:
    user = repo.get(user_id)
    return user["name"] if user else None
from typing import cast

value: object = get_value()
config = cast(dict[str, str], value)  # ื™ื“ื•ืข ืžืžืงื•ืจ ื”ืคื•ื ืงืฆื™ื”