Θεμέλια προγραμματισμού: modules και αναπαραγώγιμο debugging — DedSec Project
Θεμέλια προγραμματισμού: modules και αναπαραγώγιμο debugging Ευρετήριο θεμελίων 01. Τι είναι πρόγραμμα; — 01_What_is_a_program.md 02. Μεταβλητές και τύποι — 02_Variables_and_types.md 03…
Ευρετήριο θεμελίων
- Τι είναι πρόγραμμα; —
01_What_is_a_program.md - Μεταβλητές και τύποι —
02_Variables_and_types.md - Συνθήκες και αποφάσεις —
03_Conditions.md - Βρόχοι και επανάληψη —
04_Loops.md - Συναρτήσεις και παράμετροι —
05_Functions.md - Λίστες, λεξικά και σύνολα —
06_Collections.md - Συμβολοσειρές και Unicode —
07_Strings_and_unicode.md - Αρχεία και διαδρομές —
08_Files_and_paths.md - Σφάλματα και εξαιρέσεις —
09_Exceptions.md - Μονάδες, πακέτα και εισαγωγές —
10_Modules.md - Αλγόριθμοι και πολυπλοκότητα —
11_Algorithms.md - Ουρές, στοίβες και ευρετήρια —
12_Data_structures.md - Μονάδες ελέγχου και παλινδρομήσεις —
13_Unit_testing.md - Επαναλήψιμη αποσφαλμάτωση —
14_Debugging.md - Git και ασφαλές ιστορικό αλλαγών —
15_Git.md - Περιβάλλοντα και αναπαραγώγιμη δημιουργία —
16_Environment.md - HTTP, JSON και όρια API —
17_APIs.md - Ασφαλείς προεπιλογές και συγκατάθεση —
18_Security.md - Φορητότητα και προσβασιμότητα —
19_Portability.md - Λίστα ελέγχου έκδοσης και τεκμηρίωση —
20_Release.md
Μονάδες, πακέτα και εισαγωγές
Χώρισε μεγάλα προγράμματα σε μονάδες με σαφή όρια. Απόφυγε να εισάγεις αρχεία που εκτελούν εγκαταστάσεις ή ζητούν είσοδο κατά το import. Χρησιμοποίησε main guard.
Λυμένο παράδειγμα
def main():
print("starting")
if __name__ == "__main__":
main()
Άσκηση
Εξήγησε τι συμβαίνει αν εισαχθεί από άλλο αρχείο.
Λύση / υπόδειξη
Οι συναρτήσεις ορίζονται, αλλά η main() δεν καλείται αυτόματα.
Εντόπισε ποιο Python module φορτώθηκε
import importlib.util
spec = importlib.util.find_spec("json")
print(spec.origin if spec else "missing")
Εκτέλεσε σε νέο προσωρινό κατάλογο. Δημιούργησε εκεί τοπικό json.py και ξεκίνα νέο διερμηνευτή. Το import μπορεί να φορτώσει το δικό σου αρχείο αντί για την τυπική βιβλιοθήκη. Ένα μεταγενέστερο AttributeError στη json.loads μπορεί να είναι σύμπτωμα shadowing. Το json.__file__ δείχνει την πραγματική προέλευση. Μετονόμασε το τοπικό αρχείο και επαλήθευσε ξανά. Σε δεύτερη δοκιμή βάλε εκτύπωση κάτω από if __name__ == "__main__":, κάνε import και εξήγησε γιατί άλλες top-level εντολές συνεχίζουν να εκτελούνται. Σύγκρινε δύο working directories, sys.path και sys.executable. Πηγή: https://docs.python.org/3/tutorial/modules.html
Επαναλήψιμη αποσφαλμάτωση
Σημείωσε αναμενόμενο αποτέλεσμα, πραγματικό αποτέλεσμα, ακριβή εντολή, πλατφόρμα και το μικρότερο δείγμα που αναπαράγει το πρόβλημα. Άλλαξε ένα πράγμα κάθε φορά. Μην καταγράφεις μυστικά.
Λυμένο παράδειγμα
def divide(a, b):
if b == 0:
raise ValueError("b must be nonzero")
return a / b
print(divide(6, 2))
Άσκηση
Γράψε αναφορά σφάλματος για divide(6, 0).
Λύση / υπόδειξη
Αναμενόμενο: ελεγχόμενο σφάλμα· πραγματικό: ValueError με σαφές μήνυμα.
Από το γενικό σφάλμα στο ελάχιστο παράδειγμα
def clean_name(value):
result = value.strip()
if not result:
raise ValueError("empty")
return result
assert clean_name(" Ada ") == "Ada"
Η clean_name(None) αποτυγχάνει πριν καν ελεγχθεί το κενό όνομα. Βάλε isinstance(value, str) πριν τη strip, επέστρεψε σαφές TypeError και κράτησε regression test. Διαφορετικό λάθος είναι να ελέγχεις if not value πριν αφαιρέσεις κενά: είσοδος μόνο με whitespace τότε ξεφεύγει. Αναπαρήγαγε κάθε ελάττωμα χωριστά με την ελάχιστη είσοδο. Κατάγραψε περιβάλλον, traceback, αναμενόμενο/πραγματικό αποτέλεσμα και αλλαγμένη γραμμή. Η απόκρυψη εξαίρεσης δεν ισοδυναμεί με διόρθωση. Μην εκτυπώνεις μυστικά ή προσωπικές εγγραφές. Πηγή: https://docs.python.org/3/library/pdb.html