4 ሚሊዮን የፓይዘን ኮድ መስመሮችን ለመተየብ ዱካ። ክፍል 1

ዛሬ Dropbox ከፓይዘን ኮድ አይነት ቁጥጥርን እንዴት እንደሚይዝ የቁሳቁስን የትርጉም የመጀመሪያ ክፍል እናመጣለን።

4 ሚሊዮን የፓይዘን ኮድ መስመሮችን ለመተየብ ዱካ። ክፍል 1

Dropbox በ Python ውስጥ ብዙ ይጽፋል። ለኋላ-መጨረሻ አገልግሎቶች እና ለዴስክቶፕ ደንበኛ አፕሊኬሽኖች በጣም በስፋት የምንጠቀምበት ቋንቋ ነው። እኛ ደግሞ Go፣ TypeScript እና Rust በብዛት እንጠቀማለን ነገርግን Python ዋና ቋንቋችን ነው። ልኬታችንን ከግምት ውስጥ በማስገባት በሚሊዮኖች የሚቆጠሩ የፓይዘን ኮድ መስመሮች እየተነጋገርን ያለነው ፣ የእንደዚህ ዓይነቱ ኮድ ተለዋዋጭ ትየባ ሳያስፈልግ ግንዛቤውን አወሳሰበ እና የሰው ኃይል ምርታማነትን በእጅጉ ይነካል ጀመር። ይህንን ችግር ለመቅረፍ ማይፒን በመጠቀም ኮዳችንን ቀስ በቀስ ወደ የማይንቀሳቀስ አይነት ፍተሻ መቀየር ጀምረናል። ይህ ምናልባት ለፓይዘን በጣም ታዋቂው ራሱን የቻለ የፍተሻ ስርዓት ነው። Mypy ክፍት ምንጭ ፕሮጀክት ነው, ዋና ገንቢዎቹ በ Dropbox ውስጥ ይሰራሉ.

መሸወጃ በፓይዘን ኮድ ላይ የማይንቀሳቀስ አይነት ፍተሻን በዚህ ሚዛን ተግባራዊ ካደረጉ የመጀመሪያዎቹ ኩባንያዎች አንዱ ነው። በአሁኑ ጊዜ ማይፒ በሺዎች በሚቆጠሩ ፕሮጀክቶች ውስጥ ጥቅም ላይ ይውላል. ይህ መሣሪያ ስፍር ቁጥር የሌለው ጊዜ፣ “በጦርነት ተፈትኗል” እንደሚሉት። አሁን ያለንበት ቦታ ለመድረስ ረጅም መንገድ ተጉዘናል። በጉዞው ላይ ብዙ ያልተሳኩ ስራዎች እና ያልተሳኩ ሙከራዎች ነበሩ። ይህ ልጥፍ በፓይዘን ውስጥ የማይለዋወጥ አይነት የፍተሻ ታሪክን ይሸፍናል፣ ከድንጋያማ ጅማሬው ጀምሮ እንደ የምርምር ፕሮጄክቴ አካል፣ እስከ ዛሬ ድረስ፣ አይነት ቼክ እና አይነት ፍንጭ በፓይዘን ለሚጽፉ ስፍር ቁጥር የሌላቸው ገንቢዎች የተለመደ ነገር እየሆነ ነው። እነዚህ ስልቶች አሁን እንደ አይዲኢ እና ኮድ ተንታኞች ባሉ ብዙ መሳሪያዎች ይደገፋሉ።

ሁለተኛውን ክፍል ያንብቡ

ለምን ዓይነት ፍተሻ አስፈለገ?

በተለዋዋጭ የተተየበው Python ተጠቅመህ የሚያውቅ ከሆነ፡ ለምንድነው በቅርብ ጊዜ በማይንቀሳቀስ ትየባ እና mypy ዙሪያ እንዲህ ያለ ግርግር ሊኖርህ ይችላል። ወይም ምናልባት በተለዋዋጭ ትየባው ምክንያት Pythonን በትክክል ወደውታል እና እየሆነ ያለው ነገር በቀላሉ ያበሳጭዎታል። የስታቲክ ትየባ ዋጋ ቁልፉ የመፍትሄዎቹ ልኬት ነው፡ ፕሮጄክትዎ በሰፋ ቁጥር ወደ የማይንቀሳቀስ ትየባ ይበልጥ ያጋደሉ እና በመጨረሻም የበለጠ የሚፈልጉት ይሆናል።

አንድ የተወሰነ ፕሮጀክት በአስር ሺዎች የሚቆጠሩ መስመሮች ላይ ደርሷል እና ብዙ ፕሮግራመሮች እየሰሩበት እንደሆነ ታወቀ። ተመሳሳይ ፕሮጄክትን ስንመለከት፣ ካለን ልምድ በመነሳት የእሱን ኮድ መረዳት ገንቢዎችን ውጤታማ ለማድረግ ቁልፉ ይሆናል ማለት እንችላለን። የአይነት ማብራሪያዎች ከሌሉ፣ ለምሳሌ ወደ ተግባር ምን ዓይነት ክርክሮች እንደሚተላለፉ፣ ወይም አንድ ተግባር ምን ዓይነት መመለስ እንደሚችል ለማወቅ አስቸጋሪ ሊሆን ይችላል። የዓይነት ማብራሪያዎችን ሳይጠቀሙ ብዙውን ጊዜ ለመመለስ አስቸጋሪ የሆኑ የተለመዱ ጥያቄዎች እዚህ አሉ።

  • ይህ ተግባር ሊመለስ ይችላል 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ን የሚጠቀሙ ኩባንያዎች “ሁሉንም ነገር በስታቲስቲክስ በተፃፈ ቋንቋ እንደገና መፃፍ አለብን?” የሚል ወሳኝ ጥያቄ ሊያጋጥማቸው ይችላል።

እንደ mypy ያሉ የማረጋገጫ ሥርዓቶችን ይተይቡ ከላይ ያለውን ችግር የሚፈቱት ለገንቢው ዓይነቶችን የሚገልጽ መደበኛ ቋንቋ በማቅረብ እና ያንን ዓይነት መግለጫዎች ከፕሮግራሙ አተገባበር ጋር እንደሚዛመዱ በመፈተሽ ነው (እና እንደ አማራጭ፣ መኖራቸውን በመፈተሽ)። በአጠቃላይ እነዚህ ስርዓቶች በጥንቃቄ የተረጋገጡ ሰነዶችን በእጃችን ያስቀምጣሉ ማለት እንችላለን።

የእንደዚህ ዓይነቶቹ ስርዓቶች አጠቃቀም ሌሎች ጥቅሞች አሉት ፣ እና እነሱ ቀድሞውኑ ሙሉ በሙሉ ቀላል ያልሆኑ ናቸው-

  • የዓይነት ፍተሻ ስርዓቱ አንዳንድ ጥቃቅን (እና ትንሽ ያልሆኑ) ስህተቶችን መለየት ይችላል። ዓይነተኛ ምሳሌ ዋጋን ማካሄድ ሲረሱ ነው። None ወይም ሌላ ልዩ ሁኔታ.
  • ኮድን ማስተካከል በጣም ቀላል ነው ምክንያቱም የአይነት ቼክ ሲስተም ብዙውን ጊዜ በየትኛው ኮድ መቀየር እንዳለበት በጣም ትክክለኛ ነው. በተመሳሳይ ጊዜ, 100% የኮድ ሽፋን ከፈተናዎች ጋር ተስፋ ማድረግ አያስፈልገንም, በማንኛውም ሁኔታ, አብዛኛውን ጊዜ የማይቻል ነው. የችግሩን መንስኤ ለማወቅ ወደ ቁልል ዱካ ጥልቀት ውስጥ መግባት አያስፈልገንም።
  • በትልልቅ ፕሮጄክቶች ላይ እንኳን፣ mypy ብዙውን ጊዜ የሙሉ አይነት ፍተሻን በሰከንድ ክፍልፋይ ማድረግ ይችላል። እና የፈተናዎች አፈፃፀም ብዙውን ጊዜ በአስር ሰከንዶች ወይም ደቂቃዎች እንኳን ይወስዳል። የዓይነት ፍተሻ ስርዓቱ ለፕሮግራም አድራጊው ፈጣን ምላሽ ይሰጣል እና ስራውን በፍጥነት እንዲሰራ ያስችለዋል. የኮድ የፈተና ውጤቶችን በፍጥነት ለማግኘት እውነተኛ አካላትን በፌዝ እና በፕላስተር የሚተኩ የአሃድ ሙከራዎችን ለመጠበቅ ደካማ እና ከባድ መጻፍ አያስፈልገውም።

አይዲኢዎች እና አርታዒዎች እንደ ፒቻርም ወይም ቪዥዋል ስቱዲዮ ኮድ ለገንቢዎች ኮድ ማጠናቀቂያ፣ የስህተት ማድመቂያ እና በተለምዶ ጥቅም ላይ ለሚውሉ የቋንቋ ግንባታዎች ድጋፍ ለመስጠት የማብራሪያ አይነት ሃይልን ይጠቀማሉ። እና እነዚህ የመተየብ ጥቅሞች ጥቂቶቹ ናቸው። ለአንዳንድ ፕሮግራመሮች ይህ ሁሉ ለመተየብ የሚደግፍ ዋና መከራከሪያ ነው። ይህ ከትግበራ በኋላ ወዲያውኑ የሚጠቅም ነገር ነው. ይህ የአጠቃቀም ጉዳይ ለዓይነት የተለየ እንደ mypy አይነት የፍተሻ ስርዓት አያስፈልገውም፣ ምንም እንኳን ማይፒ ማብራሪያዎችን ከኮድ ጋር ወጥ በሆነ መልኩ እንዲይዝ የሚረዳ መሆኑ መታወቅ አለበት።

የ mypy ዳራ

የ mypy ታሪክ የጀመረው በዩኬ፣ ካምብሪጅ ውስጥ፣ Dropbox ከመቀላቀል ጥቂት አመታት በፊት ነው። እንደ የዶክትሬት ምርምር አካል በስታቲስቲክስ የተተየቡ እና ተለዋዋጭ ቋንቋዎችን በማዋሃድ ውስጥ ተሳትፌያለሁ። በጄረሚ ሲይክ እና ዋሊድ ታሃ ስለ ጭማሪ ትየባ እና በታይድ ራኬት ፕሮጄክት ላይ በፃፈው መጣጥፍ አነሳሳኝ። ተመሳሳዩን የፕሮግራም አወጣጥ ቋንቋ ለተለያዩ ፕሮጄክቶች የምጠቀምባቸውን መንገዶች ለማግኘት ሞከርኩ - ከትንሽ ስክሪፕቶች እስከ ኮድ መሠረት ብዙ ሚሊዮን መስመሮችን ያቀፈ። በተመሳሳይ ጊዜ, በማንኛውም ሚዛን ፕሮጀክት ውስጥ አንድ ሰው በጣም ትልቅ ስምምነት ማድረግ እንደሌለበት ማረጋገጥ እፈልጋለሁ. የዚህ ሁሉ አስፈላጊ አካል ቀስ በቀስ ከተተየበው የፕሮቶታይፕ ፕሮጄክት ወደ አጠቃላይ ወደተፈተነ የስታቲስቲክስ የተተየበ የተጠናቀቀ ምርት የመሄድ ሀሳብ ነበር። በእነዚህ ቀናት, እነዚህ ሀሳቦች በአብዛኛው የሚወሰዱት እንደ ቀላል ነገር ነው, ነገር ግን በ 2010 ውስጥ አሁንም በንቃት እየተመረመረ ያለው ችግር ነበር.

የመጀመሪያ ስራዬ በአይነት መፈተሽ ላይ ያነጣጠረ አልነበረም። ይልቁንስ ትንሽ "በቤት ውስጥ" ቋንቋ ተጠቀምኩ አሎሬ. እየተነጋገርን ያለነውን እንድትረዱ የሚያስችልዎት ምሳሌ ይኸውና (ማብራሪያዎች እዚህ አማራጭ ናቸው)

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

ቀለል ያለ የአፍ መፍቻ ቋንቋን መጠቀም በሳይንሳዊ ምርምር ውስጥ ጥቅም ላይ የሚውል የተለመደ አካሄድ ነው። ይህ እንደዚያ ነው, ቢያንስ ሙከራዎችን በፍጥነት እንዲያካሂዱ ስለሚያስችል እና እንዲሁም ከጥናቱ ጋር ምንም ግንኙነት የሌለው ነገር በቀላሉ ሊታለፍ ስለሚችል ነው. የእውነተኛ ዓለም ፕሮግራሚንግ ቋንቋዎች ውስብስብ አተገባበር ያላቸው ትልልቅ ክስተቶች ይሆናሉ፣ እና ይህ ሙከራን ይቀንሳል። ሆኖም፣ በቀላል ቋንቋ ላይ የተመሰረቱ ማናቸውም ውጤቶች ትንሽ አጠራጣሪ ይመስላሉ፣ ምክንያቱም እነዚህን ውጤቶች ለማግኘት ተመራማሪው ለቋንቋዎች ተግባራዊ አጠቃቀም አስፈላጊ የሆኑትን አሳቢዎች መስዋዕት አድርጎ ሊሆን ይችላል።

ለአሎሬ የእኔ አይነት አረጋጋጭ በጣም ተስፋ ሰጭ ይመስላል፣ ነገር ግን በእውነተኛ ኮድ በመሞከር ልፈትነው ፈለግኩ፣ ይህም ልትሉት ትችላላችሁ፣ በአሎሬ አልተጻፈም። እንደ እድል ሆኖ፣ የአሎሬ ቋንቋ በአብዛኛው የተመሰረተው እንደ ፒቲን ባሉ ተመሳሳይ ሀሳቦች ላይ ነው። ከፓይዘን አገባብ እና ትርጉም ጋር አብሮ መስራት እንዲችል የጽሕፈት መኪናውን መቀየር ቀላል ነበር። ይህ በክፍት ምንጭ Python ኮድ ውስጥ መፈተሽ እንድንሞክር አስችሎናል። በተጨማሪም፣ በአሎሬ የተጻፈውን ኮድ ወደ ፓይዘን ኮድ ለመቀየር ትራንስፓይለር ጻፍኩ እና የታይፕ ቼከር ኮድን ለመተርጎም ተጠቀምኩ። አሁን በፓይዘን የተፃፈ የፓይዘንን ንዑስ ክፍል የሚደግፍ አይነት የፍተሻ ስርዓት ነበረኝ፣ አንዳንድ የዚያ ቋንቋ አይነት! (ለአሎሬ ትርጉም ያላቸው አንዳንድ የስነ-ህንፃ ውሳኔዎች ለፓይዘን ተስማሚ አይደሉም፣ እና ይህ አሁንም በ mypy codebase ክፍሎች ውስጥ ይስተዋላል።)

በመሠረቱ፣ በእኔ ዓይነት ሥርዓት የሚደገፈው ቋንቋ በዚህ ነጥብ ላይ ፓይዘን ተብሎ ሊጠራ አይችልም፡ በአንዳንድ የ Python 3 ዓይነት ማብራሪያ አገባብ ውሱንነት ምክንያት የ Python ተለዋጭ ነበር።

የጃቫ እና ፓይዘን ድብልቅ ይመስላል፡-

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

በወቅቱ ከነበሩት ሃሳቦች አንዱ ይህን አይነቱን ፓይዘን ወደ ሲ ወይም ምናልባት JVM ባይትኮድ በማዘጋጀት አፈፃፀሙን ለማሻሻል የአይነት ማብራሪያዎችን መጠቀም ነበር። የአቀናባሪ ፕሮቶታይፕ ለመጻፍ ደረጃ ላይ ደረስኩ፣ ነገር ግን አይነት መፈተሽ ራሱ በጣም ጠቃሚ መስሎ ስለታየኝ ይህን ሃሳብ ተውኩት።

ፕሮጄክቴን በ PyCon 2013 በሳንታ ክላራ አቅርቤያለሁ። እኔም ስለዚህ ጉዳይ ከጊዶ ቫን ሮስም ጋር ተነጋገርኩኝ, ለህይወት ደግ የፓይዘን አምባገነን. የራሴን አገባብ እንድተው እና ከመደበኛው Python 3 syntax ጋር እንድጣበቅ አሳመነኝ። Python 3 የተግባር ማብራሪያዎችን ይደግፋል፣ ስለዚህ የእኔ ምሳሌ ከዚህ በታች እንደሚታየው እንደገና ሊፃፍ ይችላል፣ ይህም መደበኛ የፓይዘን ፕሮግራምን ያስከትላል።

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 እንድቀላቀል አሳመነኝ። የ mypy ታሪክ በጣም አስደሳች ክፍል የሚጀምረው እዚህ ላይ ነው።

ይቀጥላል…

ውድ አንባቢዎች! Pythonን የምትጠቀም ከሆነ፣ እባክህ በዚህ ቋንቋ የምታዘጋጃቸውን ፕሮጀክቶች መጠን ንገረን።

4 ሚሊዮን የፓይዘን ኮድ መስመሮችን ለመተየብ ዱካ። ክፍል 1
4 ሚሊዮን የፓይዘን ኮድ መስመሮችን ለመተየብ ዱካ። ክፍል 1

ምንጭ: hab.com

አስተያየት ያክሉ