Python කේතයේ පේළි මිලියන 4ක් ටයිප් කිරීමේ මාර්ගය. 1 කොටස

අද අපි ඔබේ අවධානයට ගෙන එන්නේ ඩ්‍රොප්බොක්ස් පයිතන් කේතයේ වර්ග පාලනය සමඟ කටයුතු කරන ආකාරය පිළිබඳ ද්‍රව්‍යයේ පරිවර්තනයේ පළමු කොටසයි.

Python කේතයේ පේළි මිලියන 4ක් ටයිප් කිරීමේ මාර්ගය. 1 කොටස

Dropbox Python හි බොහෝ දේ ලියයි. එය පසුකාලීන සේවා සහ ඩෙස්ක්ටොප් සේවාදායක යෙදුම් සඳහා අපි අතිශයින් පුළුල් ලෙස භාවිතා කරන භාෂාවකි. අපිත් Go, TypeScript, Rust ගොඩක් භාවිතා කරනවා, නමුත් Python තමයි අපේ ප්‍රධාන භාෂාව. අපගේ පරිමාණය සැලකිල්ලට ගනිමින්, අපි කතා කරන්නේ මිලියන ගණනක් පයිතන් කේත රේඛා ගැන ය, එවැනි කේතයේ ගතික ටයිප් කිරීම අනවශ්‍ය ලෙස එහි අවබෝධය සංකීර්ණ කර ශ්‍රම ඵලදායිතාවයට බරපතල ලෙස බලපාන බව පෙනී ගියේය. මෙම ගැටලුව අවම කිරීම සඳහා, අපි mypy භාවිතයෙන් අපගේ කේතය ස්ථිතික වර්ගය පරීක්ෂා කිරීමට ක්‍රමයෙන් සංක්‍රමණය කිරීමට පටන් ගෙන ඇත. මෙය Python සඳහා වඩාත්ම ජනප්‍රිය ස්වාධීන ආකාරයේ පිරික්සුම් පද්ධතිය විය හැකිය. Mypy යනු විවෘත මූලාශ්‍ර ව්‍යාපෘතියකි, එහි ප්‍රධාන සංවර්ධකයින් Dropbox හි වැඩ කරයි.

ඩ්‍රොප්බොක්ස් යනු මෙම පරිමාණයෙන් පයිතන් කේතයේ ස්ථිතික වර්ගය පරීක්ෂා කිරීම ක්‍රියාත්මක කළ පළමු සමාගම්වලින් එකකි. Mypy මේ දවස්වල ව්‍යාපෘති දහස් ගණනක භාවිතා වෙනවා. මෙම මෙවලම ගණන් කළ නොහැකි වාර ගණනක්, ඔවුන් පවසන පරිදි, "සටනේදී පරීක්ෂාවට ලක් විය." අපි දැන් ඉන්න තැනට එන්න ගොඩක් දුර ඇවිත්. ඒ අතරම, අසාර්ථක උත්සාහයන් සහ අසාර්ථක අත්හදා බැලීම් රාශියක් තිබුණි. මෙම සටහන Python හි ස්ථිතික වර්ග පරීක්ෂා කිරීමේ ඉතිහාසය ආවරණය කරයි, මගේ පර්යේෂණ ව්‍යාපෘතියේ කොටසක් ලෙස එහි පාෂාණමය ආරම්භයේ සිට, අද දක්වා, Python හි ලියන අසංඛ්‍යාත සංවර්ධකයින් සඳහා අකුරු පරීක්ෂා කිරීම සහ ටයිප් ඉඟි කිරීම සාමාන්‍ය දෙයක් බවට පත්ව ඇත. මෙම යාන්ත්‍රණ දැන් IDE සහ කේත විශ්ලේෂක වැනි බොහෝ මෙවලම් මගින් සහය දක්වයි.

දෙවන කොටස කියවන්න

වර්ගය පරීක්ෂා කිරීම අවශ්ය වන්නේ ඇයි?

ඔබ කවදා හෝ ගතිකව ටයිප් කළ 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 යනු බයිට් පෙළකි.

පරමාදර්ශී ලෝකයක, එවැනි සියුම් කරුණු සියල්ලම ගොඩනඟන ලද ලියකියවිලි (docstring) තුළ විස්තර කරනු ඇතැයි අපේක්ෂා කෙරේ. නමුත් ඔබ වැඩ කළ යුතු කේතයේ එවැනි ලේඛන බොහෝ විට නිරීක්ෂණය නොකරන බවට අත්දැකීම් බොහෝ උදාහරණ සපයයි. එවැනි ලියකියවිලි කේතයේ තිබුණත්, එහි නිරපේක්ෂ නිවැරදි බව කෙනෙකුට ගණන් ගත නොහැක. මෙම ලේඛන අපැහැදිලි, සාවද්‍ය සහ වැරදි වැටහීම් සඳහා විවෘත විය හැකිය. විශාල කණ්ඩායම් හෝ විශාල ව්යාපෘති වලදී, මෙම ගැටළුව අතිශයින් උග්ර විය හැකිය.

Python ව්‍යාපෘතිවල මුල් හෝ අතරමැදි අවස්ථා වලදී විශිෂ්ට වන අතර, යම් අවස්ථාවක සාර්ථක ව්‍යාපෘති සහ Python භාවිතා කරන සමාගම් ඉතා වැදගත් ප්‍රශ්නයකට මුහුණ දිය හැකිය: “අපි සියල්ල ස්ථිතික ලෙස ටයිප් කළ භාෂාවකින් නැවත ලිවිය යුතුද?”.

mypy වැනි වර්ග පරීක්ෂා කිරීමේ පද්ධති ඉහත ගැටලුව විසඳන්නේ වර්ග විස්තර කිරීම සඳහා සංවර්ධකයාට විධිමත් භාෂාවක් ලබා දීමෙන් සහ එම වර්ගයේ ප්‍රකාශන වැඩසටහන් ක්‍රියාත්මක කිරීම හා ගැළපෙන බව පරීක්ෂා කිරීමෙන් (සහ, විකල්ප වශයෙන්, ඒවායේ පැවැත්ම පරීක්ෂා කිරීමෙන්). පොදුවේ ගත් කල, මෙම පද්ධති පරිස්සමින් පරීක්ෂා කරන ලද ලියකියවිලි වැනි යමක් අප වෙත ලබා දෙන බව අපට පැවසිය හැකිය.

එවැනි පද්ධති භාවිතයට වෙනත් වාසි ඇති අතර ඒවා දැනටමත් සම්පූර්ණයෙන්ම සුළුපටු නොවේ:

  • වර්ග පරීක්ෂා කිරීමේ පද්ධතියට කුඩා (සහ එතරම් කුඩා නොවන) දෝෂ හඳුනාගත හැක. සාමාන්‍ය උදාහරණයක් නම්, ඔවුන්ට අගයක් සැකසීමට අමතක වූ විටය None හෝ වෙනත් විශේෂ කොන්දේසියක්.
  • කේත ප්‍රතිනිර්මාණය කිරීම බොහෝ සෙයින් සරල කර ඇත්තේ වර්ග පරීක්ෂා කිරීමේ පද්ධතිය බොහෝ විට වෙනස් කළ යුතු කේතය පිළිබඳව ඉතා නිවැරදි බැවිනි. ඒ අතරම, ඕනෑම අවස්ථාවක, සාමාන්‍යයෙන් කළ නොහැකි පරීක්ෂණ සමඟ 100% කේත ආවරණයක් බලාපොරොත්තු වීමට අපට අවශ්‍ය නැත. ගැටලුවට හේතුව සොයා ගැනීමට අපට ස්ටැක් ට්‍රේස් එකේ ගැඹුර ගැන සොයා බැලීමට අවශ්‍ය නැත.
  • විශාල ව්‍යාපෘති වලදී පවා, mypy හට බොහෝ විට තත්පරයක කොටසකින් සම්පූර්ණ වර්ගය පරීක්ෂා කළ හැක. පරීක්ෂණ ක්‍රියාත්මක කිරීම සාමාන්‍යයෙන් තත්පර දස හෝ විනාඩි පවා ගත වේ. වර්ග පරීක්ෂා කිරීමේ පද්ධතිය ක්‍රමලේඛකයාට ක්ෂණික ප්‍රතිපෝෂණ ලබා දෙන අතර ඔහුට ඔහුගේ කාර්යය වේගයෙන් කිරීමට ඉඩ සලසයි. ඔහුට තවදුරටත් කේත පරීක්ෂණ ප්‍රතිඵල වේගයෙන් ලබා ගැනීම සඳහා සැබෑ ආයතන ව්‍යාජ සහ පැච් මගින් ප්‍රතිස්ථාපනය කරන ඒකක පරීක්ෂණ බිඳෙනසුලු සහ නඩත්තු කිරීමට අපහසු ලිවීමට අවශ්‍ය නොවේ.

IDEs සහ PyCharm හෝ Visual Studio Code වැනි සංස්කාරකයන් සංවර්ධකයින්ට කේත සම්පූර්ණ කිරීම, දෝෂ උද්දීපනය කිරීම සහ බහුලව භාවිතා වන භාෂා නිර්මාණ සඳහා සහාය ලබා දීම සඳහා වර්ග විවරණවල බලය භාවිතා කරයි. ඒවගේම මේ ටයිප් කිරීමෙන් ලැබෙන ප්‍රයෝජන කිහිපයක් පමණයි. සමහර ක්‍රමලේඛකයින් සඳහා, මේ සියල්ල ටයිප් කිරීමට පක්ෂව ඇති ප්‍රධාන තර්කයයි. මෙය ක්‍රියාත්මක වූ වහාම ප්‍රතිලාභ ලබන දෙයකි. වර්ග සඳහා වන මෙම භාවිත අවස්ථාවට mypy වැනි වෙනම වර්ග පරීක්ෂා කිරීමේ පද්ධතියක් අවශ්‍ය නොවේ, කෙසේ වෙතත් mypy වර්ග විවරණ කේතයට අනුකූලව තබා ගැනීමට උපකාරී වන බව සටහන් කළ යුතුය.

mypy හි පසුබිම

Mypy හි ඉතිහාසය ආරම්භ වූයේ එක්සත් රාජධානියේ, කේම්බ්‍රිජ්හිදී, මම Dropbox හා සම්බන්ධ වීමට වසර කිහිපයකට පෙර. මම මගේ ආචාර්ය උපාධි පර්යේෂණයේ කොටසක් ලෙස ස්ථිතික ලෙස ටයිප් කරන ලද සහ ගතික භාෂා ඒකාබද්ධ කිරීමට සම්බන්ධ වී සිටිමි. Jeremy Siek සහ Walid Taha විසින් වර්ධක ටයිප් කිරීම පිළිබඳ ලිපියකින් සහ Typed Racket ව්‍යාපෘතියෙන් මම ආශ්වාදයක් ලැබුවා. මම විවිධ ව්‍යාපෘති සඳහා එකම ක්‍රමලේඛන භාෂාව භාවිතා කිරීමට ක්‍රම සොයා ගැනීමට උත්සාහ කළෙමි - කුඩා ස්ක්‍රිප්ට් වල සිට මිලියන ගණනක රේඛා වලින් සමන්විත කේත පදනම දක්වා. ඒ අතරම, මට අවශ්‍ය වූයේ ඕනෑම පරිමාණයේ ව්‍යාපෘතියකදී, කෙනෙකුට විශාල සම්මුතීන් ඇති කර ගැනීමට අවශ්‍ය නොවන බව සහතික කිරීමට ය. මේ සියල්ලේ වැදගත් අංගයක් වූයේ ටයිප් නොකළ මූලාකෘති ව්‍යාපෘතියක සිට සවිස්තරාත්මකව පරීක්‍ෂා කරන ලද ස්ථිතික ලෙස ටයිප් කරන ලද නිමි භාණ්ඩයකට ක්‍රමයෙන් මාරු වීමේ අදහසයි. මේ දිනවල, මෙම අදහස් බොහෝ දුරට ලබාගෙන ඇත, නමුත් 2010 දී එය තවමත් සක්රීයව ගවේෂණය කරන ගැටලුවක් විය.

ටයිප් චෙක් කිරීමේ මගේ මුල් කෘතිය පයිතන් ඉලක්ක කර ගත්තේ නැත. ඒ වෙනුවට මම කුඩා "ගෙදර" භාෂාවක් භාවිතා කළා ඇලර්. අප කතා කරන්නේ කුමක් දැයි ඔබට තේරුම් ගැනීමට ඉඩ සලසන උදාහරණයක් මෙන්න (වර්ග විවරණ මෙහි විකල්ප වේ):

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

සරල කළ මව් භාෂාවක් භාවිතා කිරීම විද්‍යාත්මක පර්යේෂණ වලදී භාවිතා වන පොදු ප්‍රවේශයකි. මෙය එසේ වන්නේ, අවම වශයෙන් එය ඔබට ඉක්මනින් අත්හදා බැලීම් කිරීමට ඉඩ සලසන නිසාත්, අධ්‍යයනයට කිසිදු සම්බන්ධයක් නැති දේ පහසුවෙන් නොසලකා හැරිය හැකි නිසාත් නොවේ. තථ්‍ය-ලෝක ක්‍රමලේඛන භාෂා සංකීර්ණ ක්‍රියාත්මක කිරීම් සහිත මහා පරිමාණ සංසිද්ධි වීමට නැඹුරු වන අතර මෙය අත්හදා බැලීම් මන්දගාමී කරයි. කෙසේ වෙතත්, සරල කළ භාෂාවක් මත පදනම් වූ ඕනෑම ප්‍රතිඵලයක් තරමක් සැක සහිත බව පෙනේ, මන්ද මෙම ප්‍රතිඵල ලබා ගැනීමේදී පර්යේෂකයා භාෂා ප්‍රායෝගික භාවිතය සඳහා වැදගත් කරුණු කැප කර ඇති බැවිනි.

Alore සඳහා මගේ වර්ග පරීක්ෂකය ඉතා හොඳ බලාපොරොත්තුවක් ඇති බවක් පෙනුනද, මට එය සැබෑ කේතය සමඟ අත්හදා බැලීමෙන් පරීක්ෂා කිරීමට අවශ්‍ය විය, එය Alore හි ලියා නැති බව ඔබ පැවසිය හැකිය. මගේ වාසනාවට, ඇලෝර් භාෂාව බොහෝ දුරට පයිතන් හා සමාන අදහස් මත පදනම් විය. එය පයිතන්ගේ වාක්‍ය ඛණ්ඩය සහ අර්ථ ශාස්ත්‍රය සමඟ ක්‍රියා කළ හැකි වන පරිදි ටයිප් චෙකරය ප්‍රතිනිර්මාණය කිරීමට තරම් පහසු විය. විවෘත කේත පයිතන් කේතයේ ටයිප් පරීක්ෂා කිරීමට උත්සාහ කිරීමට මෙය අපට ඉඩ දුන්නේය. ඊට අමතරව, මම Alore හි ලියා ඇති කේතය Python කේතයට පරිවර්තනය කිරීමට ට්‍රාන්ස්පයිලර් එකක් ලියා එය මගේ ටයිප් චෙකර් කේතය පරිවර්තනය කිරීමට භාවිතා කළෙමි. දැන් මා සතුව පයිතන් හි ලියා ඇති ආකාරයේ පිරික්සුම් පද්ධතියක් ඇති අතර එය පයිතන් හි උප කුලකයකට සහාය දක්වයි, එම භාෂාවේ යම් ආකාරයක! (ඇලෝර් සඳහා අර්ථවත් වූ ඇතැම් වාස්තු විද්‍යාත්මක තීරණ පයිතන් සඳහා දුර්වල ලෙස නොගැලපෙන අතර, mypy කේත පදනමේ කොටස්වල මෙය තවමත් කැපී පෙනේ.)

ඇත්ත වශයෙන්ම, මගේ ටයිප් පද්ධතිය මඟින් සහාය දක්වන භාෂාව මේ අවස්ථාවේ දී පයිතන් ලෙස හැඳින්විය නොහැක: එය පයිතන් 3 වර්ගයේ විවරණ වාක්‍ය ඛණ්ඩයේ යම් සීමාවන් හේතුවෙන් පයිතන් හි ප්‍රභේදයක් විය.

එය Java සහ Python මිශ්‍රණයක් ලෙස දිස් විය.

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

එකල මගේ අදහසක් වූයේ මෙවැනි Python C හෝ සමහරවිට JVM bytecode සම්පාදනය කිරීමෙන් කාර්ය සාධනය වැඩි දියුණු කිරීම සඳහා Type annotations භාවිතා කිරීමයි. මම සම්පාදක මූලාකෘතියක් ලිවීමේ අදියරට පැමිණියෙමි, නමුත් මම මෙම අදහස අතහැර දැමුවෙමි, මන්ද ටයිප් පරීක්ෂා කිරීම තරමක් ප්‍රයෝජනවත් බව පෙනේ.

මම මගේ ව්‍යාපෘතිය සැන්ටා ක්ලාරා හි PyCon 2013 හිදී ඉදිරිපත් කළෙමි. ජීවිතයට හිතවත් පයිතන් ඒකාධිපතියා වන Guido van Rossum සමඟද මම මේ ගැන කතා කළෙමි. ඔහු මට මගේම වාක්‍ය ඛණ්ඩය අතහැර සම්මත 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)

මෙම (සහ අනෙකුත්) වෙළඳාම් ඇත්ත වශයෙන්ම වැදගත් නොවන බව පෙනී ගියේය - ස්ථිතික ටයිප් කිරීමේ ප්‍රතිලාභ පරිශීලකයින්ට ඉතා අඩු-පරමාදර්ශී වාක්‍ය ඛණ්ඩය ගැන ඉක්මනින් අමතක විය. ටයිප්-චෙක් කරන ලද පයිතන් කේතයේ විශේෂ වාක්‍ය නිර්මිතයන් භාවිතා නොකළ බැවින්, පවතින පයිතන් මෙවලම් සහ කේත සැකසුම් ක්‍රියාවලීන් සාමාන්‍ය පරිදි ක්‍රියා කරමින්, නව මෙවලම ඉගෙන ගැනීමට සංවර්ධකයින්ට වඩාත් පහසු විය.

මම මගේ උපාධි නිබන්ධනය සම්පූර්ණ කිරීමෙන් පසු Dropbox හා සම්බන්ධ වීමට Guido මට ඒත්තු ගැන්වීය. mypy කතාවේ රසවත්ම කොටස පටන් ගන්නේ මෙතැනින්.

ඉදිරියට පැවැත්වේ…

හිතවත් පා readers කයින්! ඔබ Python භාවිතා කරන්නේ නම්, කරුණාකර ඔබ මෙම භාෂාවෙන් සංවර්ධනය කරන ව්‍යාපෘතිවල පරිමාණය ගැන අපට කියන්න.

Python කේතයේ පේළි මිලියන 4ක් ටයිප් කිරීමේ මාර්ගය. 1 කොටස
Python කේතයේ පේළි මිලියන 4ක් ටයිප් කිරීමේ මාර්ගය. 1 කොටස

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න