Skip to content

Conversation

@notanios
Copy link

@notanios notanios commented Dec 4, 2019

Unit test simple example.

@@ -0,0 +1,5 @@
from capitals import count_letters

assert count_letters('nfWEHI') == (4, 2), 'should be 4 uppercase letter and 2 lower case'
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assert scrie ca e un instrument pentru testare si verifica conditia care urmeaza. daca totul e True, nu se intampla nimic, daca e False apare o eroare si pot sa presupun ca apare si textul care l-ai pus intre ghilimele.

capitals e un modul? sau e denumirea fisierului din care se importa functia count_letters pe care tot tu ai definit-o in fisierul cela?

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cum se porneste test_capitals.py? trebuie sa fie un alt fisier care uneste ambele capitals.py si test_capitals.py?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yup, assert aruncă excepție când nu se îndeplinește condiția.

capitals în cazul dat e fișier, python tratează ca modul.

test-capitals.py pornești manual, adica $python test_capitals.py. Dar sunt instrumente de automatizare de gen pytest. Acolo și testele se scriu altfel, nu cu aserturi, și se pornesc ele toate automat, după numele test_*, și raportul e arătat, nu doar excepție când nu e corect.

letters_count()
return (count_upper, count_lower)

def main():
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

deci in main se cheama count_letters - foarte logic! :D :D I like this structure more
main e un fel de aranjare frumoasa a core-ului programului, un fel de cluster pentru toate functiile din acest fisier?
si la sfarsit se cheama doar main ca asa e mai comod/frumos?

Copy link
Author

@notanios notanios Dec 26, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

main e punctul de intrare în program, de unde el începe execuția. În mod obișnuit python execută toate instrucțiunile care nu-s în funcții la rând. Dar în cazul dat noi nu avem instrucțiuni care nu-s în funcții, doar if __name__ == "__main__": main(). Și ceea ce face bucata asta doar verifică dacă fișierul a fost chemat pentru interpretare și nu pentru import.

Adica în mod normal când ai instrucțiuni înafara funcțiilor și faci $python script.py sau import script în alt fișier rezultatul va fi același, ele vor fi executate. Dar dacă vrei la import să nu fie executate atunci trebuie să înțelegi cum e apelat fișierul și bucata cu if name anume asta face, dacă e interpretat și nu importat el va executa main, dacă nu ap nu.

print('There are {} uppercase letters'.format(results[0]))
print('There are {} lowercase letters'.format(results[1]))

if __name__ == "__main__":
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

am citit acum despre de ce se foloseste name
nu prea inteleg utilitatea lui, sau scenariile in care acesta e necesar. daca corect am inteles. name e o variabila speciala, definita de python inainte de rularea programului si daca fisierul dat se executa ca program principal (main), atunci el primeste argumentul main
respectiv daca din if, daca fisierul dat e chiar cel cu programul principal el va merge sa execute functia main. Daca nu, nu se va rula nimic? la ce ajuta asta?

Copy link
Author

@notanios notanios Dec 26, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uite bucata asta am explicat în comentariu mai sus. Utilitatea este că la import în alt fișier poate nu ai nevoie să fie executat automat main sau altă logică aferentă. Asta dă posibilitatea să folosești același cod în 2 moduri: ca program executabil; și ca logică reutilizabilă prin import.

Spre exemplu ai o aplicație pentru conversia de valută. Scrii în consolă ceva de gen $currconv -i USD -o MDL 45.35. Și la un moment dat înțelegi că vrei să folosești acest program într-o aplicație online magazin (spre exemplu) pu a converti prețurile când omul alege altă valută. Și pentru nu a scri din nou logica de conversie care deja o ai tu ai să imporți acest cod ca modul. Dar nu ai nevoie de logica de prelucrare a parametrilor -i, -o etc. ai nevoie doar de funcție unde indici ce în ce și cât. Și tot ce trebuie să faci în așa caz e să importezi acest fișier. Atât.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants