THE FUTURE MARKETACADEMY
Your classroomRoom 07 · Tech Lab
School of Data & Tech

Mga Python Project: testing, packaging at version control

Step 7 of 8 in Tech Lab

Next in your path: 7.6.3 Site Systems: bookings, payments and integrations

What you'll be able to do
  • Hatiin ang isang program sa mga module at package na may malinaw at karaniwang layout ng folder.
  • Humawak ng mga error nang sinasadya: sarili mong exception class, malinaw na mensahe at tamang exit code.
  • Magsulat ng awtomatikong test gamit ang pytest, kasama ang mga test para sa mga error at sa mga file.
  • Subaybayan ang bawat pagbabago gamit ang git: mga commit, magandang .gitignore, history at mga pagkakaiba.
  • Magtrabaho sa mga branch, i-merge ang mga ito, ayusin ang merge conflict at unawain ang mga pull request.
  • Gawing package na puwedeng i-install ang project mo gamit ang pyproject.toml at isang command na puwedeng i-type ng mga tao.
  • Mag-ship ng release: numero ng bersyon, git tag, README, lisensya at isang na-test na wheel file.

Bago ang course na ito: Python for Data: files, libraries and automation (course 7.5.2). Dapat marunong ka nang gumamit ng pathlib, magbasa ng CSV at JSON, gumawa ng virtual environment, mag-install ng mga package gamit ang pip, magsulat ng requirements.txt at bumuo ng maliit na script gamit ang argparse at logging. Kung bago pa ang mga iyan sa iyo, kunin muna ang 7.5.2. Hindi na uulitin ng course na ito ang mga iyon.

Sa buong course, bubuo ka ng isang maliit na tool na tinatawag na ordertools. Binabasa nito ang order file (isang CSV na may mga column na product, qty at price) at ipinapakita ang total. Sadyang maliit ang tool, para makatuon ka sa mga kasanayan sa project na nakapalibot dito.

Bawat code example sa course na ito ay pinatakbo at tiningnan ang output gamit ang Python 3.9, pytest 8.4.2 at git 2.50 sa Mac. Pareho ang resulta ng mas bagong mga bersyon para sa mga example na ito. Sa Windows, i-type ang py o python kung saan sinasabi ng course ang python3.

Words in this course 42Open the Vocabulary Hall
01

Mga module, package at layout ng project

In simple words

Ang malaking program sa isang file ay parang kusinang nasa iisang drawer ang lahat ng kaldero, kutsara at plato. Ang mga module ay magkakahiwalay na drawer, bawat isa ay may isang klase ng gamit. Ang package ay aparador na puno ng mga drawer na may label, at ang layout ng project ay plano ng buong kusina, para makita ng kahit sino ang kahit ano.

Key facts
  • Ang module ay kahit anong .py file. Magagamit ito ng ibang file gamit ang import prices o from prices import with_tax.
  • Ang code ng module ay tumatakbo nang isang beses, sa unang pag-import nito sa isang program.
  • Bawat module ay may pangalan sa __name__. Kapag direkta mong pinatakbo ang file, ang __name__ nito ay "__main__". Kapag ini-import ito, ang __name__ ay ang pangalan ng module. Kaya ang code sa loob ng if __name__ == "__main__": ay tumatakbo lang kapag ang mismong file ang pinatakbo mo, hindi kapag may nag-import nito.
  • Ang package ay folder ng mga module. Inirerekomenda ng Python Packaging User Guide na maglagay ng __init__.py file dito (puwedeng walang laman), para ma-import ang folder bilang regular na package.
  • Ginagamit ng packaging tutorial ang src layout: ang package folder mo ay nasa loob ng folder na tinatawag na src, katabi ng pyproject.toml, README.md, LICENSE at isang tests folder.
  • Ang file na tinatawag na __main__.py sa loob ng package ay nagpapahintulot sa mga tao na patakbuhin ang package gamit ang python3 -m packagename.
  • Magandang gawi: ilagay ang logic (mga kalkulasyon, mga pagsusuri) sa isang module na walang pagpi-print at walang input(), at ilagay ang interface (argparse, pagpi-print) sa ibang module. Mas madaling i-test ang logic na walang pagpi-print (Lesson 3).

Ang layout ng ordertools:

ordertools/
├── pyproject.toml    (Lesson 6)
├── README.md
├── LICENSE
├── .gitignore      (Lesson 4)
├── src/
│  └── ordertools/
│    ├── __init__.py  (holds __version__ = "0.1.0")
│    ├── __main__.py  (lets you run python3 -m ordertools)
│    ├── core.py    (the logic)
│    └── cli.py    (the command line)
└── tests/
  ├── test_core.py
  └── test_cli.py
Halimbawa (tested): dalawang module

prices.py:

"""Helpers for prices."""
TAX_RATE = 0.10


def with_tax(price, rate=TAX_RATE):
  return round(price * (1 + rate), 2)


print("prices.py: __name__ is", __name__)

if __name__ == "__main__":
  print("Running prices.py directly:", with_tax(20))

shop.py:

import prices
from prices import with_tax

print(prices.TAX_RATE, with_tax(50), with_tax(50, rate=0.05))

Patakbuhin ang python3 prices.py: nagpi-print ito ng prices.py: __name__ is __main__ at Running prices.py directly: 22.0. Patakbuhin ang python3 shop.py: nagpi-print ito ng prices.py: __name__ is prices (isang beses lang, kahit dalawang beses ini-import ng shop.py ang prices) at 0.1 55.0 52.5. Hindi lumalabas ang linyang "Running directly", dahil in-import ang prices.py, hindi pinatakbo.

Step by step
  1. Gumawa ng folder na tinatawag na l1, i-save ang prices.py at shop.py doon nang eksakto ayon sa pagkakalarawan.
  2. Patakbuhin ang python3 prices.py at basahin ang dalawang linya.
  3. Patakbuhin ang python3 shop.py at ihambing: aling linya ang nawala, at bakit?
  4. Ngayon gawin ang totoong mga folder ng project: ordertools/src/ordertools at ordertools/tests.
  5. Sa loob ng src/ordertools, gumawa ng __init__.py na may isang linya: __version__ = "0.1.0".
  6. Gumawa ng mga walang laman na file na core.py, cli.py at __main__.py sa tabi nito. Pupunan mo ang mga ito sa Lesson 2 at 6.
  7. Check: tugma ang mga folder mo sa layout sa itaas, at kaya mong ipaliwanag sa isang pangungusap kung ano ang ginagawa ng if __name__ == "__main__":.
Watch on YouTube
Python tutorial: if __name__ == '__main__'Corey Schafer · YouTube · youtube.com

Videos by other creators on YouTube, for reference. They are not made by or affiliated with The Future Market.

LESSON 01Mga module, package at layout ng project
LESSON 01 / ANIMATED LESSON / ENGLISH VOICE00:00 / 01:00
Read the video script
[Host] "Ang isang higanteng file ay magulong kusina. Bigyan natin ng drawer ang lahat."
[Screen: prices.py at shop.py magkatabi] "Ang module ay py file lang. I-import ito, at magagamit mo ang mga function nito."
[Screen: terminal na nagpapakita ng __name__ is __main__, tapos __name__ is prices] "Patakbuhin ang file nang direkta at main ang pangalan nito. I-import ito, at ang pangalan ng module ang magiging pangalan nito. Kaya gumagana ang main check."
[Screen: ang puno ng folder ng ordertools na may src at tests] "Ang package ay folder ng mga module. Ilagay ito sa src, nasa tabi ang tests, at ihiwalay ang logic sa pagpi-print."
Try it now

Magdagdag ng pangatlong module na labels.py sa l1 folder na may function na money(x) na nagbabalik ng text tulad ng $12.50. I-import ito sa shop.py at i-print ang money(with_tax(50)). Magdagdag ng if __name__ == "__main__": block sa labels.py na nagpi-print ng mabilis na self-check, at patunayang hindi ito tumatakbo kapag ini-import ito ng shop.py.

ClaudeStuck? Copy a ready-made prompt for Claude

Copy this, open Claude, paste it, and Claude will walk you through the lesson step by step.

For a grown-up: Claude is for adults (18+). Copy this, paste it into Claude, and use the answer to explain the lesson to your child.

I'm learning "Mga Python Project: testing, packaging at version control" on The Future Market. Lesson 1: "Mga module, package at layout ng project".

What the lesson teaches:
- Ang module ay kahit anong .py file. Magagamit ito ng ibang file gamit ang import prices o from prices import with_tax.
- Ang code ng module ay tumatakbo nang isang beses, sa unang pag-import nito sa isang program.
- Bawat module ay may pangalan sa __name__. Kapag direkta mong pinatakbo ang file, ang __name__ nito ay "__main__". Kapag ini-import ito, ang __name__ ay ang pangalan ng module. Kaya ang code sa loob ng if __name__ == "__main__": ay tumatakbo lang kapag ang mismong file ang pinatakbo mo, hindi kapag may nag-import nito.
- Ang package ay folder ng mga module. Inirerekomenda ng Python Packaging User Guide na maglagay ng __init__.py file dito (puwedeng walang laman), para ma-import ang folder bilang regular na package.
- Ginagamit ng packaging tutorial ang src layout: ang package folder mo ay nasa loob ng folder na tinatawag na src, katabi ng pyproject.toml, README.md, LICENSE at isang tests folder.
- Ang file na tinatawag na __main__.py sa loob ng package ay nagpapahintulot sa mga tao na patakbuhin ang package gamit ang python3 -m packagename.
- Magandang gawi: ilagay ang logic (mga kalkulasyon, mga pagsusuri) sa isang module na walang pagpi-print at walang input(), at ilagay ang interface (argparse, pagpi-print) sa ibang module. Mas madaling i-test ang logic na walang pagpi-print (Lesson 3).

The exercise I'm working on:
Magdagdag ng pangatlong module na labels.py sa l1 folder na may function na money(x) na nagbabalik ng text tulad ng $12.50. I-import ito sa shop.py at i-print ang money(with_tax(50)). Magdagdag ng if __name__ == "__main__": block sa labels.py na nagpi-print ng mabilis na self-check, at patunayang hindi ito tumatakbo kapag ini-import ito ng shop.py.

I'm stuck. Please:
1. Explain the main idea in plain, simple words with one everyday example.
2. Walk me through the exercise one small step at a time. Ask me what I've done so far before giving the next step.
3. Don't just give me the final answer. Help me do it myself, and check my work when I share it.
I'm a parent helping my child (about 8 years old) with a lesson called "Mga module, package at layout ng project" from the course "Mga Python Project: testing, packaging at version control".

Here's what the lesson says:
Ang malaking program sa isang file ay parang kusinang nasa iisang drawer ang lahat ng kaldero, kutsara at plato. Ang mga module ay magkakahiwalay na drawer, bawat isa ay may isang klase ng gamit. Ang package ay aparador na puno ng mga drawer na may label, at ang layout ng project ay plano ng buong kusina, para makita ng kahit sino ang kahit ano.

The activity:
Magdagdag ng pangatlong module na labels.py sa l1 folder na may function na money(x) na nagbabalik ng text tulad ng $12.50. I-import ito sa shop.py at i-print ang money(with_tax(50)). Magdagdag ng if __name__ == "__main__": block sa labels.py na nagpi-print ng mabilis na self-check, at patunayang hindi ito tumatakbo kapag ini-import ito ng shop.py.

Please explain this so an 8-year-old understands: short sentences, a fun everyday example, and no hard words.
Then give me 3 simple questions I can ask my child to check they understood, and a way to do the activity together, one tiny step at a time.
Open Claude
Sources
My notes
02

Mga error nang sinasadya: exceptions, mensahe at exit code

This lesson is part of full access: every course and every level for one payment.

03

Awtomatikong test gamit ang pytest

This lesson is part of full access: every course and every level for one payment.

04

Subaybayan ang bawat pagbabago gamit ang git

This lesson is part of full access: every course and every level for one payment.

05

Mga branch, merge at pull request

This lesson is part of full access: every course and every level for one payment.

06

Packaging gamit ang pyproject.toml

This lesson is part of full access: every course and every level for one payment.

07

I-ship ito: mga bersyon, tag at release na maii-install ng iba

This lesson is part of full access: every course and every level for one payment.

++

Final project

This lesson is part of full access: every course and every level for one payment.

??

Quiz

  1. Ano ang ginagawa ng if __name__ == "__main__":?

  2. Bakit panatilihing magkahiwalay na module ang logic at pagpi-print?

  3. Kailan tumatakbo ang else na bahagi ng try statement?

  4. Ano ang idinaragdag ng raise NewError(...) from exc?

  5. Anong exit code ang nangangahulugang nagtagumpay ang command-line tool?

  6. Aling mga file at function ang awtomatikong pinapatakbo ng pytest?

  7. Paano mo ite-test na nag-raise ng error ang isang function?

  8. Ano ang ipinapakita ng git diff --staged?

  9. Magbigay ng dalawang bagay na dapat nasa .gitignore ng isang Python project.

  10. Ano ang gagawin mo para matapos ang merge conflict?

  11. Ano ang ginagawa ng ordertotal = "ordertools.cli:main" sa ilalim ng [project.scripts]?

  12. Sa semantic versioning, aling numero ang nagbabago para sa bagong feature na walang sinisira?

EX

Final exam

This lesson is part of full access: every course and every level for one payment.

CE

Certificate

This lesson is part of full access: every course and every level for one payment.