مرور ساده و سریع بر Python Types


ما در پایتون مثل تقریبا تمام زبان های برنامه نویسی type annotations یا type hints رو داریم(از ورژن 3.5 به بعد اضافه شده) فقط با این تفاوت که داخل پایتون اجباری به رعایت این کار نیست اما این به این معنی نیست که نباید اینکارو انجام داد.

اگه میخاید:

  • کد استانداردی داشته باشید
  • ماژول یا لایبرری بنویسید
  • با تیم یا داخل شرکتی کارکنید

شما مجبورید از این ویژگی پایتون استفاده کنید و فکر استفاده نکردنشو از سرتون بیرون کنید.

همیشه بهترین مرجع داکیومنت های رسمی هست که از این لینک میتونید بخش typing داکیومنت پایتون رو بخونید اما از اونجایی که زمان بر هست و ممکنه با انگلیسی بودنش مشکل داشته باشید من اینجا چیزای پایه ای و قسمت های مهمشو براتون توضیح میدم و برای یادگیری عمیق تر به داکیومنت مراجعه کنید.


مشخص کردن نوع Type

در حالت کلی اعلام کردن type متغییر به این صورت انجام میشه :

var: type = value

میتونیم به همین صورت متغییری را تعریف کنیم یا نوع property کلاس یا نوع ورودی فاکشن را اعلام کنیم

age: int = 20

class Person:
    name: str

def f(item: str):
    pass

و همچنین نوع خروجی تابع را با علامت -> سپس type مدنظر مشخص میشه :

def say_hello(name: str) -> str:
    return 'Hello ' + name

در مثال بالا فانکشن ما یک پارامتر تحت اسم name داره که گفتیم از نوع str باید باشه و خروجی هم یک str هست.


حالا بنظرتون اگه ما بجای string تایپ دیگ ای به آرگومان تابع بدیم چی میشه؟

اتفاق خاصی نمیفته(فارق از اینکه Hello میتونه با اون تایپ جمع بشه یا نه)

اجرای کد اروری به ما نمیده این اعلام کردن تایپ ها به دو دلیله

  • برای مشخص بودن نوع متغییر بین خودمون یا سایر هم تیمی هایی که روی کد کار میکنن
  • باعث میشه IDE ما بفهمه چه چیزی باید فرستاده بشه یا برگردونده بشه که باز این خودش باعث بهتر کارکردن snippets و نشون دادن warning های بهتر برای دیباگ کردن میشه.

انواع types

شما میتونید از type های built-in پایتون استفاده کنید

تایپ های زیر جزو تایپ های ساده بحساب میاد و نکته خاصی ندارد

  • int
  • float
  • bool
  • bytes

تایپ های بعدی که در ادامه معرفی میشوند در ورژن های 3.8 و قبل تر باید از ماژول typing اون رو import میکردید اما از 3.9 و به بعد این کار منسوخ شده و باید مستقیم از همون تایپ بدون ایمپورت کردن استفاده کرد برای مثال تایپ لیست در 3.8 از typing.List استفاده میشد اما در 3.9 از list استفاده میشود

#3.8 Version
from typing import List
def f(item: List):
    pass
#3.9 Version
def f(item: list):
    pass


list:

به چند صورت میتوان از لیست استفاده کرد

def f(items1: list, items2: list[int], items3: list[list[int]]):
    pass

هر پارامتر به این صورت عمل میکند

  • items1 : هر نوع لیستی را میتوان فرستاد
  • items2: لیستی که فقط اعداد صحیح دارد
  • items3: لیستی که درون آن لیستی از عداد صحیح وجود دارد(میتوان یک ماتریس دو بعدی فرض کرد)

و به همین صورت میتوان بسته به نیاز نوع لیست مدنظر اون رو تعریف کرد


tuple :

def f(items1: tuple[int],items2: tuple[float,int,int]):
    pass
  • items1: تاپلی از اعداد صحیح
  • items2: تاپلی که سه عضو دارد اولی عدد اعشاری دومی و سومی اعداد صحیح


dict :

def f(prices: dict[str,int]):
    pass

این نوع تایپ برای پارامتر prices به این معنی هست که دیکشنری کلید های str و مقادیر int دارد


جزئیات بیشتر و سایر تایپ های دیگه رو میتونید داخل داکیومنت رسمی بخونید.


قابلیت های بیشتر

شما میتونید:

  • چند حالت رو برای نوع تایپ اعلام کنید
def f(item : str | int):
    pass
  • برای تایپ مدنظر alias قرار بدین
type Matrix2d = list[list[int]]
def sum_matrix(m1: Matrix2d, m2: Matrix2d):
    pass
  • فقط مقادیر مشخصی رو بگیرین
from typing import Literal
def open_helper(file: str, mode: Literal['r', 'rb', 'w', 'wb']) -> str:
    ...
  • مشخص کنید مقدار متغییر قرار نیست تغییر بکنه
from typing import Final
MAX_SIZE: Final = 9000


و بسیاری قابلیت فراوون دیگه

تا اینجا فقط خواستم یه دیدگاهی بگیرین که این سیستم چطور کار میکنه و چه کارایی از پسش برمیاد, و چون سیستم تایپینگ پایتون توی هر ورژن دچار تغییرات زیادی میشه ممکنه بعضی از چیز های گفته شده توی ورژن های جدیدتر منسوخ بشه در حال حاضر تا ورژن 3.12 معتبر هست.