د Python کوډ 4 ملیون لینونو ټایپ چیک کولو لاره. برخه 1

نن ورځ موږ ستاسو پام ته د موادو د ژباړې لومړۍ برخه راوړو چې څنګه ډراپ باکس د پایتون کوډ ډول کنټرول سره معامله کوي.

د Python کوډ 4 ملیون لینونو ټایپ چیک کولو لاره. برخه 1

ډراپ باکس په پایتون کې ډیر څه لیکي. دا یوه ژبه ده چې موږ یې په پراخه کچه کاروو ، دواړه د شاته پای خدماتو او ډیسټاپ پیرودونکي غوښتنلیکونو لپاره. موږ Go، TypeScript او Rust هم ډیر کاروو، مګر Python زموږ اصلي ژبه ده. زموږ د اندازې په پام کې نیولو سره، او موږ د Python کوډ د ملیونونو لینونو په اړه خبرې کوو، دا معلومه شوه چې د دې ډول کوډ متحرک ټایپ کول په غیر ضروري توګه د هغې پوهه پیچلې کړې او د کار تولید په جدي توګه اغیزه کوي. د دې ستونزې د کمولو لپاره، موږ په تدریجي ډول خپل کوډ د mypy په کارولو سره جامد ډول چک کولو ته لیږدول پیل کړي. دا شاید د Python لپاره د سټایلون ډول چیک کولو خورا مشهور سیسټم وي. Mypy د خلاصې سرچینې پروژه ده، د هغې اصلي پراختیا کونکي په ډراپ باکس کې کار کوي.

ډراپ باکس یو له لومړیو شرکتونو څخه و چې پدې پیمانه د Python کوډ کې د جامد ډول چیک کولو پلي کول. Mypy پدې ورځو کې په زرګونو پروژو کې کارول کیږي. دا وسیله بې شمیره وختونه، لکه څنګه چې دوی وايي، "په جګړه کې ازمول شوي." موږ د هغه ځای ته د رسیدو لپاره اوږده لاره تللې ده چې اوس یو. د لارې په اوږدو کې، ډیری ناکامې هڅې او ناکامې تجربې وې. دا پوسټ په پایتون کې د جامد ډول چیک کولو تاریخ پوښي ، زما د څیړنې پروژې د یوې برخې په توګه د هغې له ډبرې پیل څخه تر نن ورځې پورې ، کله چې د ټایپ چیک کول او د ډول نښه کول د بې شمیره پراختیا کونکو لپاره معمول شوي چې په پایتون کې لیکي. دا میکانیزمونه اوس د ډیری وسیلو لکه IDEs او کوډ تحلیل کونکو لخوا ملاتړ کیږي.

دوهمه برخه ولولئ

ولې ډول چک کول اړین دي؟

که تاسو کله هم په متحرک ډول ټایپ شوی Python کارولی وي، تاسو ممکن یو څه ګډوډ ولرئ چې ولې په دې وروستیو کې د جامد ټایپ کولو او mypy په شاوخوا کې دومره ګډوډي شتون لري. یا شاید تاسو د پیتون دقیقا د دې متحرک ټایپ کولو له امله خوښ کړئ ، او هغه څه چې پیښیږي په ساده ډول تاسو خپه کوي. د جامد ټایپ کولو ارزښت کلیدي د حلونو پیمانه ده: څومره چې ستاسو پروژه لویه وي ، هومره تاسو د جامد ټایپ کولو په لور تکیه کوئ ، او په پای کې ، هومره نور چې تاسو واقعیا ورته اړتیا لرئ.

فرض کړئ چې یوه ځانګړې پروژه د لسګونو زرو لینونو اندازې ته رسیدلې، او دا معلومه شوه چې ډیری پروګرام کونکي په دې کار کوي. د ورته پروژې په لټه کې ، زموږ د تجربې پراساس ، موږ کولی شو ووایو چې د دې کوډ پوهیدل به د پراختیا کونکو تولید ساتلو کلي وي. د ډول تشریحاتو پرته، دا معلومه کول ستونزمن کیدی شي، د بیلګې په توګه، کوم دلیل چې فنکشن ته لیږدول کیږي، یا کوم ډول فنکشن بیرته راستانه کیدی شي. دلته عادي پوښتنې دي چې ډیری وختونه د ډول تشریحاتو کارولو پرته ځواب ورکول ستونزمن وي:

  • کولی شي دا فعالیت بیرته راستانه شي None?
  • دا دلیل باید څه وي؟ items?
  • د صفت ډول څه شی دی id: int دا دی ، str، یا شاید ځینې دودیز ډول؟
  • ایا دا دلیل باید یو لیست وي؟ ایا دا ممکنه ده چې یو ټپل دې ته انتقال شي؟

که تاسو د لاندې ډول - تشریح شوي کوډ ټوټې وګورئ او ورته پوښتنو ته د ځواب ویلو هڅه وکړئ، نو دا معلومه شوه چې دا خورا ساده کار دی:

class Resource:
    id: bytes
    ...
    def read_metadata(self, 
                      items: Sequence[str]) -> Dict[str, MetadataItem]:
        ...

  • read_metadata بیرته نه راځي Noneځکه چې د بیرته ستنیدو ډول ندی Optional[…].
  • دلیل items د کرښو لړۍ ده. دا په تصادفي توګه نه شي تکرار کیدی.
  • صفت id د بایټ تار دی.

په یوه مثالي نړۍ کې، یو څوک تمه لري چې دا ډول ټول فرعي ټکي به په جوړ شوي اسنادو (ډاکټرینګ) کې بیان شي. مګر تجربه د دې حقیقت ډیری مثالونه وړاندې کوي چې دا ډول اسناد اکثرا په کوډ کې نه لیدل کیږي چې تاسو ورسره کار کوئ. حتی که دا ډول اسناد په کوډ کې شتون ولري، یو څوک نشي کولی د هغې بشپړ درستیت حساب کړي. دا اسناد مبهم، ناسم، او د غلط فهمۍ لپاره خلاص وي. په لویو ټیمونو یا لویو پروژو کې، دا ستونزه خورا شدید کیدی شي.

پداسې حال کې چې Python د پروژو په لومړیو یا منځنیو مرحلو کې ښه والی لري، په ځینو وختونو کې بریالي پروژې او شرکتونه چې Python کاروي ممکن د حیاتي پوښتنې سره مخ شي: "ایا موږ باید هرڅه په جامد ډول ټایپ شوې ژبه بیا ولیکو؟".

د ډول چک کولو سیسټمونه لکه mypy د ډولونو تشریح کولو لپاره پراختیا کونکي ته د رسمي ژبې چمتو کولو سره پورتنۍ ستونزه حل کوي ، او د دې ډول اعالمیې چیک کولو سره د برنامې پلي کولو سره سمون لري (او په اختیاري توګه د دوی شتون چیک کولو سره). په عموم کې، موږ کولی شو ووایو چې دا سیسټمونه زموږ په اختیار کې یو څه لري لکه په احتیاط سره چک شوي اسناد.

د داسې سیسټمونو کارول نورې ګټې لري، او دوی لا دمخه په بشپړه توګه غیر معمولي دي:

  • د ډول چک کولو سیسټم کولی شي ځینې کوچنۍ (او دومره کوچنۍ نه) تېروتنې کشف کړي. یو عام مثال دی کله چې دوی د ارزښت پروسس کول هیر کړي None یا کوم بل ځانګړي حالت.
  • د کوډ ریفیکٹرینګ خورا ساده شوی ځکه چې د ډول چیک کولو سیسټم ډیری وختونه د دې په اړه خورا دقیق وي چې کوم کوډ بدلولو ته اړتیا لري. په ورته وخت کې، موږ اړتیا نلرو چې د ازموینو سره د 100٪ کوډ پوښښ لپاره امید وکړو، کوم چې په هر حالت کې، معمولا ممکن نه وي. موږ اړتیا نلرو چې د سټیک ټریس ژورو ته لاړ شو ترڅو د ستونزې لامل ومومئ.
  • حتی په لویو پروژو کې، mypy اکثرا د یوې ثانیې په یوه برخه کې بشپړ ډول چک کول کولی شي. او د ازموینو اجرا کول معمولا لسګونه ثانیې یا حتی دقیقې وخت نیسي. د ډول چک کولو سیسټم پروګرامر ته فوري فیډبیک ورکوي او هغه ته اجازه ورکوي چې خپله دنده ګړندۍ کړي. هغه نور د واحد ازموینې ساتلو لپاره نازک او سخت لیکلو ته اړتیا نلري چې د کوډ ازموینې پایلې ګړندي ترلاسه کولو لپاره اصلي ادارې د ټوکو او پیچونو سره ځای په ځای کړي.

IDEs او ایډیټران لکه PyCharm یا Visual Studio Code د ډول تشریحاتو ځواک کاروي ترڅو پراختیا کونکو ته د کوډ بشپړولو ، د خطا روښانه کول ، او د عام کارول شوي ژبې جوړښتونو لپاره ملاتړ چمتو کړي. او دا یوازې د ټایپ کولو ځینې ګټې دي. د ځینو پروګرام کونکو لپاره، دا ټول د ټایپ کولو په حق کې اصلي دلیل دی. دا هغه څه دي چې د پلي کیدو وروسته سمدلاسه ګټه پورته کوي. د ډولونو لپاره د دې کارولو قضیه د مایپي په څیر جلا ډول چیک کولو سیسټم ته اړتیا نلري، که څه هم دا باید په یاد ولرئ چې مای پی د کوډ سره سم د ډول تشریحاتو ساتلو کې مرسته کوي.

د mypy پس منظر

د مایپي تاریخ په انګلستان کې پیل شو ، په کیمبرج کې ، څو کاله دمخه چې زه ډراپ باکس کې شامل شوم. زه د خپل دوکتورا څیړنې د یوې برخې په توګه د جامد ټایپ شوي او متحرک ژبو په یووالي کې ښکیل شوی یم. زه د جیریمي سییک او ولید طه لخوا د زیاتیدونکي ټایپ کولو په اړه د یوې مقالې څخه الهام اخلم، او د ټایپډ ریکیټ پروژې لخوا. ما هڅه وکړه چې د مختلفو پروژو لپاره د ورته پروګرامینګ ژبې کارولو لارې ومومئ - د کوچنیو سکریپټونو څخه د کوډ بیسونو پورې چې ډیری ملیون لینونه لري. په ورته وخت کې، ما غوښتل ډاډ ترلاسه کړم چې د هرې کچې پروژې کې، یو څوک به ډیر لوی جوړجاړی ونه کړي. د دې ټولو یوه مهمه برخه په تدریجي ډول د نه ټایپ شوي پروټوټایپ پروژې څخه په هراړخیز ډول ازمول شوي جامد ټایپ شوي محصول ته د حرکت کولو نظر و. په دې ورځو کې، دا نظرونه په پراخه کچه د منلو وړ دي، مګر په 2010 کې دا یوه ستونزه وه چې لاهم په فعاله توګه وپلټل شوه.

د ډول چک کولو کې زما اصلي کار د Python په هدف نه و. پرځای یې، ما یوه کوچنۍ "کورنۍ" ژبه کارولې الور. دلته یو مثال دی چې تاسو ته به اجازه درکړي چې پوه شي چې موږ د څه په اړه خبرې کوو (د ډول تشریحات دلته اختیاري دي):

def Fib(n as Int) as Int
  if n <= 1
    return n
  else
    return Fib(n - 1) + Fib(n - 2)
  end
end

د ساده مورنۍ ژبې کارول یوه عامه طریقه ده چې په ساینسي څیړنو کې کارول کیږي. دا دومره دی، لږترلږه ځکه چې دا تاسو ته اجازه درکوي په چټکۍ سره تجربې ترسره کړئ، او همدارنګه د دې حقیقت له امله چې د مطالعې سره هیڅ تړاو نلري په اسانۍ سره له پامه غورځول کیدی شي. د ریښتیني نړۍ برنامې ژبې د پیچلي پلي کیدو سره په لویه کچه پیښې دي ، او دا تجربه ورو کوي. په هرصورت، د ساده ژبې پر بنسټ کومې پایلې یو څه شکمن ښکاري، ځکه چې د دې پایلو په ترلاسه کولو کې څیړونکي ممکن د ژبې د عملي کارونې لپاره مهم نظرونه قرباني کړي وي.

د الور لپاره زما ډول چیکر ډیر امید لرونکی ښکاریده، مګر ما غوښتل دا د ریښتیني کوډ په تجربه کولو سره معاینه کړم، کوم چې تاسو شاید ووایاست، په الور کې نه و لیکل شوی. خوشبختانه زما لپاره، د الور ژبه په لویه کچه د Python په څیر د ورته نظرونو پراساس وه. دا دومره اسانه وه چې د ټایپ چیکر بیا جوړ کړئ ترڅو دا د Python ترکیب او سیمانټیک سره کار وکړي. دې موږ ته اجازه راکړه چې د خلاصې سرچینې Python کوډ کې د ټایپ چیک کولو هڅه وکړو. سربیره پردې ، ما په الور کې لیکل شوي کوډ پایتون کوډ ته بدلولو لپاره یو ټرانسپیلر لیکلی او زما د ټایپ چیکر کوډ ژباړلو لپاره یې کارولی. اوس ما په Python کې لیکل شوی د ډول چیک کولو سیسټم درلود چې د Python د فرعي سیټ ملاتړ کوي ، د دې ژبې یو ډول! (ځینې معمارۍ پریکړې چې د الور لپاره یې معنی درلوده د Python لپاره مناسب نه و، او دا لاهم د مایپي کوډبیس په برخو کې د پام وړ دی.)

په حقیقت کې ، هغه ژبه چې زما د ډول سیسټم لخوا ملاتړ کیږي پدې مرحله کې د پایتون په نوم نشي ویل کیدی: دا د Python 3 ډوله تشریح ترکیب ځینې محدودیتونو له امله د پایتون یو ډول و.

دا د جاوا او پایتون ترکیب په څیر ښکاري:

int fib(int n):
    if n <= 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

په هغه وخت کې زما یو نظر دا و چې د دې ډول Python C ته تالیف کولو سره د فعالیت ښه کولو لپاره د ډول تشریحات وکاروئ ، یا شاید JVM بایټ کوډ. زه د کمپیلر پروټوټایپ لیکلو مرحلې ته ورسیدم ، مګر ما دا نظر پریښود ، ځکه چې د ډول چیک کول پخپله خورا ګټور ښکاري.

ما په سانټا کلارا کې په PyCon 2013 کې خپله پروژه وړاندې کړه. ما د دې په اړه د ګیډو وان روسم سره هم خبرې وکړې، د ژوند لپاره د پایتون دیکتاتور. هغه زه قانع کړم چې خپل ترکیب پریږدم او د معیاري Python 3 ترکیب سره ودریږم. Python 3 د فنکشن تشریحاتو ملاتړ کوي، نو زما مثال بیا لیکل کیدی شي لکه څنګه چې لاندې ښودل شوي، په پایله کې د عام Python پروګرام په پایله کې:

def fib(n: int) -> int:
    if n <= 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

زه باید یو څه جوړجاړی وکړم (لومړی، زه غواړم په یاد ولرم چې ما د همدې دلیل لپاره خپل ترکیب ایجاد کړی دی). په ځانګړې توګه، Python 3.3، په هغه وخت کې د ژبې ترټولو وروستۍ نسخه، د متغیر تشریحاتو ملاتړ نه کوي. ما د ګیډو سره د بریښنالیک له لارې د داسې تشریحاتو ترکیب ډیزاین لپاره مختلف امکاناتو په اړه بحث وکړ. موږ پریکړه وکړه چې د متغیرونو لپاره ډول تبصرې وکاروو. دا مطلوب هدف ته خدمت وکړ، مګر یو څه پیچلی و (Python 3.6 موږ ته یو ښه ترکیب راکړ):

products = []  # type: List[str]  # Eww

د ډول تبصرې د Python 2 ملاتړ لپاره هم په کار دي، کوم چې د ډول تشریحاتو لپاره جوړ شوی ملاتړ نلري:

f fib(n):
    # type: (int) -> int
    if n <= 1:
        return n
    else:
        return fib(n - 1) + fib(n - 2)

دا معلومه شوه چې دا (او نور) سوداګریز بندونه واقعیا مهم ندي - د جامد ټایپ کولو ګټې پدې معنی دي چې کاروونکي ډیر ژر د مثالي ترکیب څخه لږ هیر کړي. څرنګه چې د ټایپ چیک شوي Python کوډ کې کوم ځانګړي ترکیبي جوړښتونه ندي کارول شوي، د Python موجوده وسیلې او د کوډ پروسس کولو پروسې په نورمال ډول کار کولو ته دوام ورکوي، دا د پراختیا کونکو لپاره د نوي وسیلې زده کول خورا اسانه کوي.

ګیډو هم زه قانع کړم چې د فراغت مقالې بشپړولو وروسته په ډراپ باکس کې شامل شم. دا هغه ځای دی چې د مایپي کیسه خورا زړه پورې برخه پیل کیږي.

نور بیا…

ګرانو لوستونکو! که تاسو Python کاروئ، مهرباني وکړئ موږ ته د هغو پروژو د کچې په اړه ووایاست چې تاسو په دې ژبه کې وده کوئ.

د Python کوډ 4 ملیون لینونو ټایپ چیک کولو لاره. برخه 1
د Python کوډ 4 ملیون لینونو ټایپ چیک کولو لاره. برخه 1

سرچینه: www.habr.com

Add a comment