pythonlings 0.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pythonlings/__init__.py +0 -0
- pythonlings/__main__.py +4 -0
- pythonlings/app.py +84 -0
- pythonlings/cli.py +318 -0
- pythonlings/core/__init__.py +0 -0
- pythonlings/core/curriculum.py +106 -0
- pythonlings/core/docs.py +68 -0
- pythonlings/core/exercise.py +33 -0
- pythonlings/core/manifest.py +110 -0
- pythonlings/core/reset.py +43 -0
- pythonlings/core/runner.py +114 -0
- pythonlings/core/solutions.py +17 -0
- pythonlings/core/state.py +86 -0
- pythonlings/curriculum/checks/async/async1.py +4 -0
- pythonlings/curriculum/checks/async/async10.py +4 -0
- pythonlings/curriculum/checks/async/async2.py +4 -0
- pythonlings/curriculum/checks/async/async3.py +4 -0
- pythonlings/curriculum/checks/async/async4.py +4 -0
- pythonlings/curriculum/checks/async/async5.py +4 -0
- pythonlings/curriculum/checks/async/async6.py +4 -0
- pythonlings/curriculum/checks/async/async7.py +4 -0
- pythonlings/curriculum/checks/async/async8.py +2 -0
- pythonlings/curriculum/checks/async/async9.py +4 -0
- pythonlings/curriculum/checks/classes/classes1.py +3 -0
- pythonlings/curriculum/checks/classes/classes10.py +5 -0
- pythonlings/curriculum/checks/classes/classes11.py +5 -0
- pythonlings/curriculum/checks/classes/classes12.py +16 -0
- pythonlings/curriculum/checks/classes/classes2.py +3 -0
- pythonlings/curriculum/checks/classes/classes3.py +4 -0
- pythonlings/curriculum/checks/classes/classes4.py +4 -0
- pythonlings/curriculum/checks/classes/classes5.py +5 -0
- pythonlings/curriculum/checks/classes/classes6.py +4 -0
- pythonlings/curriculum/checks/classes/classes7.py +3 -0
- pythonlings/curriculum/checks/classes/classes8.py +3 -0
- pythonlings/curriculum/checks/classes/classes9.py +4 -0
- pythonlings/curriculum/checks/collections/collections1.py +4 -0
- pythonlings/curriculum/checks/collections/collections10.py +15 -0
- pythonlings/curriculum/checks/collections/collections2.py +4 -0
- pythonlings/curriculum/checks/collections/collections3.py +5 -0
- pythonlings/curriculum/checks/collections/collections4.py +4 -0
- pythonlings/curriculum/checks/collections/collections5.py +5 -0
- pythonlings/curriculum/checks/collections/collections6.py +6 -0
- pythonlings/curriculum/checks/collections/collections7.py +4 -0
- pythonlings/curriculum/checks/collections/collections8.py +5 -0
- pythonlings/curriculum/checks/collections/collections9.py +9 -0
- pythonlings/curriculum/checks/comprehensions/comprehensions1.py +3 -0
- pythonlings/curriculum/checks/comprehensions/comprehensions10.py +5 -0
- pythonlings/curriculum/checks/comprehensions/comprehensions2.py +3 -0
- pythonlings/curriculum/checks/comprehensions/comprehensions3.py +3 -0
- pythonlings/curriculum/checks/comprehensions/comprehensions4.py +6 -0
- pythonlings/curriculum/checks/comprehensions/comprehensions5.py +3 -0
- pythonlings/curriculum/checks/comprehensions/comprehensions6.py +3 -0
- pythonlings/curriculum/checks/comprehensions/comprehensions7.py +4 -0
- pythonlings/curriculum/checks/comprehensions/comprehensions8.py +5 -0
- pythonlings/curriculum/checks/comprehensions/comprehensions9.py +3 -0
- pythonlings/curriculum/checks/conditionals/conditionals1.py +2 -0
- pythonlings/curriculum/checks/conditionals/conditionals10.py +10 -0
- pythonlings/curriculum/checks/conditionals/conditionals2.py +5 -0
- pythonlings/curriculum/checks/conditionals/conditionals3.py +9 -0
- pythonlings/curriculum/checks/conditionals/conditionals4.py +7 -0
- pythonlings/curriculum/checks/conditionals/conditionals5.py +9 -0
- pythonlings/curriculum/checks/conditionals/conditionals6.py +7 -0
- pythonlings/curriculum/checks/conditionals/conditionals7.py +7 -0
- pythonlings/curriculum/checks/conditionals/conditionals8.py +9 -0
- pythonlings/curriculum/checks/conditionals/conditionals9.py +7 -0
- pythonlings/curriculum/checks/context_managers/context_managers1.py +15 -0
- pythonlings/curriculum/checks/context_managers/context_managers2.py +10 -0
- pythonlings/curriculum/checks/context_managers/context_managers3.py +2 -0
- pythonlings/curriculum/checks/context_managers/context_managers4.py +3 -0
- pythonlings/curriculum/checks/context_managers/context_managers5.py +5 -0
- pythonlings/curriculum/checks/context_managers/context_managers6.py +4 -0
- pythonlings/curriculum/checks/context_managers/context_managers7.py +16 -0
- pythonlings/curriculum/checks/context_managers/context_managers8.py +15 -0
- pythonlings/curriculum/checks/dataclasses/dataclasses1.py +3 -0
- pythonlings/curriculum/checks/dataclasses/dataclasses2.py +5 -0
- pythonlings/curriculum/checks/dataclasses/dataclasses3.py +4 -0
- pythonlings/curriculum/checks/dataclasses/dataclasses4.py +3 -0
- pythonlings/curriculum/checks/dataclasses/dataclasses5.py +9 -0
- pythonlings/curriculum/checks/dataclasses/dataclasses6.py +6 -0
- pythonlings/curriculum/checks/dataclasses/dataclasses7.py +6 -0
- pythonlings/curriculum/checks/dataclasses/dataclasses8.py +5 -0
- pythonlings/curriculum/checks/datetime/datetime1.py +4 -0
- pythonlings/curriculum/checks/datetime/datetime2.py +4 -0
- pythonlings/curriculum/checks/datetime/datetime3.py +6 -0
- pythonlings/curriculum/checks/datetime/datetime4.py +2 -0
- pythonlings/curriculum/checks/datetime/datetime5.py +2 -0
- pythonlings/curriculum/checks/datetime/datetime6.py +2 -0
- pythonlings/curriculum/checks/datetime/datetime7.py +2 -0
- pythonlings/curriculum/checks/datetime/datetime8.py +5 -0
- pythonlings/curriculum/checks/decorators/decorators1.py +8 -0
- pythonlings/curriculum/checks/decorators/decorators10.py +12 -0
- pythonlings/curriculum/checks/decorators/decorators2.py +5 -0
- pythonlings/curriculum/checks/decorators/decorators3.py +4 -0
- pythonlings/curriculum/checks/decorators/decorators4.py +7 -0
- pythonlings/curriculum/checks/decorators/decorators5.py +5 -0
- pythonlings/curriculum/checks/decorators/decorators6.py +8 -0
- pythonlings/curriculum/checks/decorators/decorators7.py +12 -0
- pythonlings/curriculum/checks/decorators/decorators8.py +20 -0
- pythonlings/curriculum/checks/decorators/decorators9.py +4 -0
- pythonlings/curriculum/checks/dictionaries/dictionaries1.py +3 -0
- pythonlings/curriculum/checks/dictionaries/dictionaries10.py +5 -0
- pythonlings/curriculum/checks/dictionaries/dictionaries2.py +2 -0
- pythonlings/curriculum/checks/dictionaries/dictionaries3.py +5 -0
- pythonlings/curriculum/checks/dictionaries/dictionaries4.py +5 -0
- pythonlings/curriculum/checks/dictionaries/dictionaries5.py +11 -0
- pythonlings/curriculum/checks/dictionaries/dictionaries6.py +4 -0
- pythonlings/curriculum/checks/dictionaries/dictionaries7.py +5 -0
- pythonlings/curriculum/checks/dictionaries/dictionaries8.py +4 -0
- pythonlings/curriculum/checks/dictionaries/dictionaries9.py +4 -0
- pythonlings/curriculum/checks/enums/enums1.py +4 -0
- pythonlings/curriculum/checks/enums/enums2.py +3 -0
- pythonlings/curriculum/checks/enums/enums3.py +3 -0
- pythonlings/curriculum/checks/enums/enums4.py +2 -0
- pythonlings/curriculum/checks/enums/enums5.py +4 -0
- pythonlings/curriculum/checks/enums/enums6.py +3 -0
- pythonlings/curriculum/checks/exceptions/exceptions1.py +4 -0
- pythonlings/curriculum/checks/exceptions/exceptions10.py +39 -0
- pythonlings/curriculum/checks/exceptions/exceptions2.py +5 -0
- pythonlings/curriculum/checks/exceptions/exceptions3.py +8 -0
- pythonlings/curriculum/checks/exceptions/exceptions4.py +5 -0
- pythonlings/curriculum/checks/exceptions/exceptions5.py +10 -0
- pythonlings/curriculum/checks/exceptions/exceptions6.py +17 -0
- pythonlings/curriculum/checks/exceptions/exceptions7.py +15 -0
- pythonlings/curriculum/checks/exceptions/exceptions8.py +6 -0
- pythonlings/curriculum/checks/exceptions/exceptions9.py +16 -0
- pythonlings/curriculum/checks/file_io/file_io1.py +15 -0
- pythonlings/curriculum/checks/file_io/file_io10.py +16 -0
- pythonlings/curriculum/checks/file_io/file_io2.py +10 -0
- pythonlings/curriculum/checks/file_io/file_io3.py +15 -0
- pythonlings/curriculum/checks/file_io/file_io4.py +14 -0
- pythonlings/curriculum/checks/file_io/file_io5.py +15 -0
- pythonlings/curriculum/checks/file_io/file_io6.py +10 -0
- pythonlings/curriculum/checks/file_io/file_io7.py +15 -0
- pythonlings/curriculum/checks/file_io/file_io8.py +12 -0
- pythonlings/curriculum/checks/file_io/file_io9.py +10 -0
- pythonlings/curriculum/checks/functional/functional1.py +4 -0
- pythonlings/curriculum/checks/functional/functional10.py +7 -0
- pythonlings/curriculum/checks/functional/functional2.py +5 -0
- pythonlings/curriculum/checks/functional/functional3.py +3 -0
- pythonlings/curriculum/checks/functional/functional4.py +4 -0
- pythonlings/curriculum/checks/functional/functional5.py +6 -0
- pythonlings/curriculum/checks/functional/functional6.py +8 -0
- pythonlings/curriculum/checks/functional/functional7.py +8 -0
- pythonlings/curriculum/checks/functional/functional8.py +7 -0
- pythonlings/curriculum/checks/functional/functional9.py +8 -0
- pythonlings/curriculum/checks/functions/functions1.py +9 -0
- pythonlings/curriculum/checks/functions/functions10.py +12 -0
- pythonlings/curriculum/checks/functions/functions2.py +4 -0
- pythonlings/curriculum/checks/functions/functions3.py +6 -0
- pythonlings/curriculum/checks/functions/functions4.py +6 -0
- pythonlings/curriculum/checks/functions/functions5.py +6 -0
- pythonlings/curriculum/checks/functions/functions6.py +8 -0
- pythonlings/curriculum/checks/functions/functions7.py +7 -0
- pythonlings/curriculum/checks/functions/functions8.py +6 -0
- pythonlings/curriculum/checks/functions/functions9.py +7 -0
- pythonlings/curriculum/checks/generators/generators1.py +4 -0
- pythonlings/curriculum/checks/generators/generators10.py +7 -0
- pythonlings/curriculum/checks/generators/generators2.py +3 -0
- pythonlings/curriculum/checks/generators/generators3.py +4 -0
- pythonlings/curriculum/checks/generators/generators4.py +9 -0
- pythonlings/curriculum/checks/generators/generators5.py +10 -0
- pythonlings/curriculum/checks/generators/generators6.py +8 -0
- pythonlings/curriculum/checks/generators/generators7.py +11 -0
- pythonlings/curriculum/checks/generators/generators8.py +8 -0
- pythonlings/curriculum/checks/generators/generators9.py +13 -0
- pythonlings/curriculum/checks/itertools/itertools1.py +2 -0
- pythonlings/curriculum/checks/itertools/itertools2.py +2 -0
- pythonlings/curriculum/checks/itertools/itertools3.py +2 -0
- pythonlings/curriculum/checks/itertools/itertools4.py +2 -0
- pythonlings/curriculum/checks/itertools/itertools5.py +2 -0
- pythonlings/curriculum/checks/itertools/itertools6.py +2 -0
- pythonlings/curriculum/checks/itertools/itertools7.py +2 -0
- pythonlings/curriculum/checks/itertools/itertools8.py +3 -0
- pythonlings/curriculum/checks/json/json1.py +3 -0
- pythonlings/curriculum/checks/json/json2.py +2 -0
- pythonlings/curriculum/checks/json/json3.py +2 -0
- pythonlings/curriculum/checks/json/json4.py +2 -0
- pythonlings/curriculum/checks/json/json5.py +2 -0
- pythonlings/curriculum/checks/json/json6.py +2 -0
- pythonlings/curriculum/checks/json/json7.py +3 -0
- pythonlings/curriculum/checks/json/json8.py +4 -0
- pythonlings/curriculum/checks/lists/lists1.py +2 -0
- pythonlings/curriculum/checks/lists/lists10.py +5 -0
- pythonlings/curriculum/checks/lists/lists2.py +3 -0
- pythonlings/curriculum/checks/lists/lists3.py +4 -0
- pythonlings/curriculum/checks/lists/lists4.py +3 -0
- pythonlings/curriculum/checks/lists/lists5.py +4 -0
- pythonlings/curriculum/checks/lists/lists6.py +3 -0
- pythonlings/curriculum/checks/lists/lists7.py +4 -0
- pythonlings/curriculum/checks/lists/lists8.py +7 -0
- pythonlings/curriculum/checks/lists/lists9.py +4 -0
- pythonlings/curriculum/checks/loops/loops1.py +2 -0
- pythonlings/curriculum/checks/loops/loops10.py +6 -0
- pythonlings/curriculum/checks/loops/loops2.py +2 -0
- pythonlings/curriculum/checks/loops/loops3.py +2 -0
- pythonlings/curriculum/checks/loops/loops4.py +3 -0
- pythonlings/curriculum/checks/loops/loops5.py +2 -0
- pythonlings/curriculum/checks/loops/loops6.py +2 -0
- pythonlings/curriculum/checks/loops/loops7.py +2 -0
- pythonlings/curriculum/checks/loops/loops8.py +2 -0
- pythonlings/curriculum/checks/loops/loops9.py +3 -0
- pythonlings/curriculum/checks/modules/modules1.py +2 -0
- pythonlings/curriculum/checks/modules/modules2.py +2 -0
- pythonlings/curriculum/checks/modules/modules3.py +5 -0
- pythonlings/curriculum/checks/modules/modules4.py +8 -0
- pythonlings/curriculum/checks/modules/modules5.py +7 -0
- pythonlings/curriculum/checks/modules/modules6.py +4 -0
- pythonlings/curriculum/checks/modules/modules7.py +4 -0
- pythonlings/curriculum/checks/modules/modules8.py +15 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced1.py +4 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced10.py +3 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced11.py +3 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced12.py +4 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced2.py +4 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced3.py +3 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced4.py +3 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced5.py +3 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced6.py +2 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced7.py +3 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced8.py +3 -0
- pythonlings/curriculum/checks/oop_advanced/oop_advanced9.py +4 -0
- pythonlings/curriculum/checks/pathlib/pathlib1.py +5 -0
- pythonlings/curriculum/checks/pathlib/pathlib2.py +4 -0
- pythonlings/curriculum/checks/pathlib/pathlib3.py +6 -0
- pythonlings/curriculum/checks/pathlib/pathlib4.py +4 -0
- pythonlings/curriculum/checks/pathlib/pathlib5.py +4 -0
- pythonlings/curriculum/checks/pathlib/pathlib6.py +5 -0
- pythonlings/curriculum/checks/recursion/recursion1.py +5 -0
- pythonlings/curriculum/checks/recursion/recursion2.py +5 -0
- pythonlings/curriculum/checks/recursion/recursion3.py +6 -0
- pythonlings/curriculum/checks/recursion/recursion4.py +6 -0
- pythonlings/curriculum/checks/recursion/recursion5.py +7 -0
- pythonlings/curriculum/checks/recursion/recursion6.py +7 -0
- pythonlings/curriculum/checks/recursion/recursion7.py +7 -0
- pythonlings/curriculum/checks/recursion/recursion8.py +15 -0
- pythonlings/curriculum/checks/regex/regex1.py +3 -0
- pythonlings/curriculum/checks/regex/regex10.py +17 -0
- pythonlings/curriculum/checks/regex/regex2.py +3 -0
- pythonlings/curriculum/checks/regex/regex3.py +2 -0
- pythonlings/curriculum/checks/regex/regex4.py +4 -0
- pythonlings/curriculum/checks/regex/regex5.py +4 -0
- pythonlings/curriculum/checks/regex/regex6.py +6 -0
- pythonlings/curriculum/checks/regex/regex7.py +5 -0
- pythonlings/curriculum/checks/regex/regex8.py +6 -0
- pythonlings/curriculum/checks/regex/regex9.py +8 -0
- pythonlings/curriculum/checks/sets/sets1.py +3 -0
- pythonlings/curriculum/checks/sets/sets10.py +15 -0
- pythonlings/curriculum/checks/sets/sets2.py +5 -0
- pythonlings/curriculum/checks/sets/sets3.py +5 -0
- pythonlings/curriculum/checks/sets/sets4.py +3 -0
- pythonlings/curriculum/checks/sets/sets5.py +3 -0
- pythonlings/curriculum/checks/sets/sets6.py +3 -0
- pythonlings/curriculum/checks/sets/sets7.py +5 -0
- pythonlings/curriculum/checks/sets/sets8.py +5 -0
- pythonlings/curriculum/checks/sets/sets9.py +3 -0
- pythonlings/curriculum/checks/strings/strings1.py +3 -0
- pythonlings/curriculum/checks/strings/strings10.py +5 -0
- pythonlings/curriculum/checks/strings/strings2.py +3 -0
- pythonlings/curriculum/checks/strings/strings3.py +3 -0
- pythonlings/curriculum/checks/strings/strings4.py +2 -0
- pythonlings/curriculum/checks/strings/strings5.py +4 -0
- pythonlings/curriculum/checks/strings/strings6.py +3 -0
- pythonlings/curriculum/checks/strings/strings7.py +3 -0
- pythonlings/curriculum/checks/strings/strings8.py +3 -0
- pythonlings/curriculum/checks/strings/strings9.py +3 -0
- pythonlings/curriculum/checks/testing/testing1.py +2 -0
- pythonlings/curriculum/checks/testing/testing10.py +9 -0
- pythonlings/curriculum/checks/testing/testing11.py +7 -0
- pythonlings/curriculum/checks/testing/testing12.py +19 -0
- pythonlings/curriculum/checks/testing/testing2.py +2 -0
- pythonlings/curriculum/checks/testing/testing3.py +12 -0
- pythonlings/curriculum/checks/testing/testing4.py +6 -0
- pythonlings/curriculum/checks/testing/testing5.py +6 -0
- pythonlings/curriculum/checks/testing/testing6.py +14 -0
- pythonlings/curriculum/checks/testing/testing7.py +14 -0
- pythonlings/curriculum/checks/testing/testing8.py +27 -0
- pythonlings/curriculum/checks/testing/testing9.py +14 -0
- pythonlings/curriculum/checks/tuples/tuples1.py +3 -0
- pythonlings/curriculum/checks/tuples/tuples10.py +6 -0
- pythonlings/curriculum/checks/tuples/tuples2.py +3 -0
- pythonlings/curriculum/checks/tuples/tuples3.py +4 -0
- pythonlings/curriculum/checks/tuples/tuples4.py +3 -0
- pythonlings/curriculum/checks/tuples/tuples5.py +4 -0
- pythonlings/curriculum/checks/tuples/tuples6.py +5 -0
- pythonlings/curriculum/checks/tuples/tuples7.py +3 -0
- pythonlings/curriculum/checks/tuples/tuples8.py +4 -0
- pythonlings/curriculum/checks/tuples/tuples9.py +5 -0
- pythonlings/curriculum/checks/type_hints/type_hints1.py +3 -0
- pythonlings/curriculum/checks/type_hints/type_hints2.py +5 -0
- pythonlings/curriculum/checks/type_hints/type_hints3.py +5 -0
- pythonlings/curriculum/checks/type_hints/type_hints4.py +5 -0
- pythonlings/curriculum/checks/type_hints/type_hints5.py +6 -0
- pythonlings/curriculum/checks/type_hints/type_hints6.py +7 -0
- pythonlings/curriculum/checks/type_hints/type_hints7.py +9 -0
- pythonlings/curriculum/checks/type_hints/type_hints8.py +9 -0
- pythonlings/curriculum/checks/variables/variables1.py +7 -0
- pythonlings/curriculum/checks/variables/variables10.py +4 -0
- pythonlings/curriculum/checks/variables/variables2.py +19 -0
- pythonlings/curriculum/checks/variables/variables3.py +4 -0
- pythonlings/curriculum/checks/variables/variables4.py +2 -0
- pythonlings/curriculum/checks/variables/variables5.py +2 -0
- pythonlings/curriculum/checks/variables/variables6.py +4 -0
- pythonlings/curriculum/checks/variables/variables7.py +3 -0
- pythonlings/curriculum/checks/variables/variables8.py +4 -0
- pythonlings/curriculum/checks/variables/variables9.py +3 -0
- pythonlings/curriculum/exercises/async/async1.py +7 -0
- pythonlings/curriculum/exercises/async/async10.py +14 -0
- pythonlings/curriculum/exercises/async/async2.py +10 -0
- pythonlings/curriculum/exercises/async/async3.py +10 -0
- pythonlings/curriculum/exercises/async/async4.py +15 -0
- pythonlings/curriculum/exercises/async/async5.py +13 -0
- pythonlings/curriculum/exercises/async/async6.py +14 -0
- pythonlings/curriculum/exercises/async/async7.py +13 -0
- pythonlings/curriculum/exercises/async/async8.py +11 -0
- pythonlings/curriculum/exercises/async/async9.py +13 -0
- pythonlings/curriculum/exercises/classes/classes1.py +13 -0
- pythonlings/curriculum/exercises/classes/classes10.py +22 -0
- pythonlings/curriculum/exercises/classes/classes11.py +24 -0
- pythonlings/curriculum/exercises/classes/classes12.py +33 -0
- pythonlings/curriculum/exercises/classes/classes2.py +13 -0
- pythonlings/curriculum/exercises/classes/classes3.py +13 -0
- pythonlings/curriculum/exercises/classes/classes4.py +16 -0
- pythonlings/curriculum/exercises/classes/classes5.py +18 -0
- pythonlings/curriculum/exercises/classes/classes6.py +15 -0
- pythonlings/curriculum/exercises/classes/classes7.py +18 -0
- pythonlings/curriculum/exercises/classes/classes8.py +14 -0
- pythonlings/curriculum/exercises/classes/classes9.py +18 -0
- pythonlings/curriculum/exercises/collections/collections1.py +11 -0
- pythonlings/curriculum/exercises/collections/collections10.py +37 -0
- pythonlings/curriculum/exercises/collections/collections2.py +18 -0
- pythonlings/curriculum/exercises/collections/collections3.py +17 -0
- pythonlings/curriculum/exercises/collections/collections4.py +26 -0
- pythonlings/curriculum/exercises/collections/collections5.py +14 -0
- pythonlings/curriculum/exercises/collections/collections6.py +18 -0
- pythonlings/curriculum/exercises/collections/collections7.py +20 -0
- pythonlings/curriculum/exercises/collections/collections8.py +23 -0
- pythonlings/curriculum/exercises/collections/collections9.py +21 -0
- pythonlings/curriculum/exercises/comprehensions/comprehensions1.py +10 -0
- pythonlings/curriculum/exercises/comprehensions/comprehensions10.py +15 -0
- pythonlings/curriculum/exercises/comprehensions/comprehensions2.py +12 -0
- pythonlings/curriculum/exercises/comprehensions/comprehensions3.py +12 -0
- pythonlings/curriculum/exercises/comprehensions/comprehensions4.py +14 -0
- pythonlings/curriculum/exercises/comprehensions/comprehensions5.py +12 -0
- pythonlings/curriculum/exercises/comprehensions/comprehensions6.py +12 -0
- pythonlings/curriculum/exercises/comprehensions/comprehensions7.py +12 -0
- pythonlings/curriculum/exercises/comprehensions/comprehensions8.py +15 -0
- pythonlings/curriculum/exercises/comprehensions/comprehensions9.py +13 -0
- pythonlings/curriculum/exercises/conditionals/conditionals1.py +15 -0
- pythonlings/curriculum/exercises/conditionals/conditionals10.py +18 -0
- pythonlings/curriculum/exercises/conditionals/conditionals2.py +13 -0
- pythonlings/curriculum/exercises/conditionals/conditionals3.py +18 -0
- pythonlings/curriculum/exercises/conditionals/conditionals4.py +20 -0
- pythonlings/curriculum/exercises/conditionals/conditionals5.py +17 -0
- pythonlings/curriculum/exercises/conditionals/conditionals6.py +15 -0
- pythonlings/curriculum/exercises/conditionals/conditionals7.py +18 -0
- pythonlings/curriculum/exercises/conditionals/conditionals8.py +20 -0
- pythonlings/curriculum/exercises/conditionals/conditionals9.py +12 -0
- pythonlings/curriculum/exercises/context_managers/context_managers1.py +18 -0
- pythonlings/curriculum/exercises/context_managers/context_managers2.py +19 -0
- pythonlings/curriculum/exercises/context_managers/context_managers3.py +24 -0
- pythonlings/curriculum/exercises/context_managers/context_managers4.py +30 -0
- pythonlings/curriculum/exercises/context_managers/context_managers5.py +30 -0
- pythonlings/curriculum/exercises/context_managers/context_managers6.py +26 -0
- pythonlings/curriculum/exercises/context_managers/context_managers7.py +30 -0
- pythonlings/curriculum/exercises/context_managers/context_managers8.py +45 -0
- pythonlings/curriculum/exercises/dataclasses/dataclasses1.py +14 -0
- pythonlings/curriculum/exercises/dataclasses/dataclasses2.py +23 -0
- pythonlings/curriculum/exercises/dataclasses/dataclasses3.py +21 -0
- pythonlings/curriculum/exercises/dataclasses/dataclasses4.py +25 -0
- pythonlings/curriculum/exercises/dataclasses/dataclasses5.py +25 -0
- pythonlings/curriculum/exercises/dataclasses/dataclasses6.py +21 -0
- pythonlings/curriculum/exercises/dataclasses/dataclasses7.py +27 -0
- pythonlings/curriculum/exercises/dataclasses/dataclasses8.py +30 -0
- pythonlings/curriculum/exercises/datetime/datetime1.py +8 -0
- pythonlings/curriculum/exercises/datetime/datetime2.py +9 -0
- pythonlings/curriculum/exercises/datetime/datetime3.py +9 -0
- pythonlings/curriculum/exercises/datetime/datetime4.py +9 -0
- pythonlings/curriculum/exercises/datetime/datetime5.py +10 -0
- pythonlings/curriculum/exercises/datetime/datetime6.py +10 -0
- pythonlings/curriculum/exercises/datetime/datetime7.py +10 -0
- pythonlings/curriculum/exercises/datetime/datetime8.py +11 -0
- pythonlings/curriculum/exercises/decorators/decorators1.py +19 -0
- pythonlings/curriculum/exercises/decorators/decorators10.py +32 -0
- pythonlings/curriculum/exercises/decorators/decorators2.py +22 -0
- pythonlings/curriculum/exercises/decorators/decorators3.py +18 -0
- pythonlings/curriculum/exercises/decorators/decorators4.py +24 -0
- pythonlings/curriculum/exercises/decorators/decorators5.py +25 -0
- pythonlings/curriculum/exercises/decorators/decorators6.py +19 -0
- pythonlings/curriculum/exercises/decorators/decorators7.py +25 -0
- pythonlings/curriculum/exercises/decorators/decorators8.py +25 -0
- pythonlings/curriculum/exercises/decorators/decorators9.py +26 -0
- pythonlings/curriculum/exercises/dictionaries/dictionaries1.py +6 -0
- pythonlings/curriculum/exercises/dictionaries/dictionaries10.py +17 -0
- pythonlings/curriculum/exercises/dictionaries/dictionaries2.py +9 -0
- pythonlings/curriculum/exercises/dictionaries/dictionaries3.py +16 -0
- pythonlings/curriculum/exercises/dictionaries/dictionaries4.py +15 -0
- pythonlings/curriculum/exercises/dictionaries/dictionaries5.py +15 -0
- pythonlings/curriculum/exercises/dictionaries/dictionaries6.py +18 -0
- pythonlings/curriculum/exercises/dictionaries/dictionaries7.py +17 -0
- pythonlings/curriculum/exercises/dictionaries/dictionaries8.py +17 -0
- pythonlings/curriculum/exercises/dictionaries/dictionaries9.py +25 -0
- pythonlings/curriculum/exercises/enums/enums1.py +12 -0
- pythonlings/curriculum/exercises/enums/enums2.py +11 -0
- pythonlings/curriculum/exercises/enums/enums3.py +14 -0
- pythonlings/curriculum/exercises/enums/enums4.py +13 -0
- pythonlings/curriculum/exercises/enums/enums5.py +14 -0
- pythonlings/curriculum/exercises/enums/enums6.py +15 -0
- pythonlings/curriculum/exercises/exceptions/exceptions1.py +15 -0
- pythonlings/curriculum/exercises/exceptions/exceptions10.py +19 -0
- pythonlings/curriculum/exercises/exceptions/exceptions2.py +12 -0
- pythonlings/curriculum/exercises/exceptions/exceptions3.py +13 -0
- pythonlings/curriculum/exercises/exceptions/exceptions4.py +17 -0
- pythonlings/curriculum/exercises/exceptions/exceptions5.py +20 -0
- pythonlings/curriculum/exercises/exceptions/exceptions6.py +13 -0
- pythonlings/curriculum/exercises/exceptions/exceptions7.py +15 -0
- pythonlings/curriculum/exercises/exceptions/exceptions8.py +17 -0
- pythonlings/curriculum/exercises/exceptions/exceptions9.py +20 -0
- pythonlings/curriculum/exercises/file_io/file_io1.py +18 -0
- pythonlings/curriculum/exercises/file_io/file_io10.py +25 -0
- pythonlings/curriculum/exercises/file_io/file_io2.py +16 -0
- pythonlings/curriculum/exercises/file_io/file_io3.py +18 -0
- pythonlings/curriculum/exercises/file_io/file_io4.py +21 -0
- pythonlings/curriculum/exercises/file_io/file_io5.py +19 -0
- pythonlings/curriculum/exercises/file_io/file_io6.py +22 -0
- pythonlings/curriculum/exercises/file_io/file_io7.py +20 -0
- pythonlings/curriculum/exercises/file_io/file_io8.py +18 -0
- pythonlings/curriculum/exercises/file_io/file_io9.py +19 -0
- pythonlings/curriculum/exercises/functional/functional1.py +7 -0
- pythonlings/curriculum/exercises/functional/functional10.py +19 -0
- pythonlings/curriculum/exercises/functional/functional2.py +8 -0
- pythonlings/curriculum/exercises/functional/functional3.py +11 -0
- pythonlings/curriculum/exercises/functional/functional4.py +11 -0
- pythonlings/curriculum/exercises/functional/functional5.py +11 -0
- pythonlings/curriculum/exercises/functional/functional6.py +14 -0
- pythonlings/curriculum/exercises/functional/functional7.py +12 -0
- pythonlings/curriculum/exercises/functional/functional8.py +13 -0
- pythonlings/curriculum/exercises/functional/functional9.py +15 -0
- pythonlings/curriculum/exercises/functions/functions1.py +8 -0
- pythonlings/curriculum/exercises/functions/functions10.py +19 -0
- pythonlings/curriculum/exercises/functions/functions2.py +9 -0
- pythonlings/curriculum/exercises/functions/functions3.py +8 -0
- pythonlings/curriculum/exercises/functions/functions4.py +8 -0
- pythonlings/curriculum/exercises/functions/functions5.py +11 -0
- pythonlings/curriculum/exercises/functions/functions6.py +16 -0
- pythonlings/curriculum/exercises/functions/functions7.py +11 -0
- pythonlings/curriculum/exercises/functions/functions8.py +10 -0
- pythonlings/curriculum/exercises/functions/functions9.py +16 -0
- pythonlings/curriculum/exercises/generators/generators1.py +13 -0
- pythonlings/curriculum/exercises/generators/generators10.py +16 -0
- pythonlings/curriculum/exercises/generators/generators2.py +17 -0
- pythonlings/curriculum/exercises/generators/generators3.py +19 -0
- pythonlings/curriculum/exercises/generators/generators4.py +12 -0
- pythonlings/curriculum/exercises/generators/generators5.py +24 -0
- pythonlings/curriculum/exercises/generators/generators6.py +20 -0
- pythonlings/curriculum/exercises/generators/generators7.py +14 -0
- pythonlings/curriculum/exercises/generators/generators8.py +17 -0
- pythonlings/curriculum/exercises/generators/generators9.py +26 -0
- pythonlings/curriculum/exercises/itertools/itertools1.py +10 -0
- pythonlings/curriculum/exercises/itertools/itertools2.py +8 -0
- pythonlings/curriculum/exercises/itertools/itertools3.py +10 -0
- pythonlings/curriculum/exercises/itertools/itertools4.py +12 -0
- pythonlings/curriculum/exercises/itertools/itertools5.py +9 -0
- pythonlings/curriculum/exercises/itertools/itertools6.py +9 -0
- pythonlings/curriculum/exercises/itertools/itertools7.py +10 -0
- pythonlings/curriculum/exercises/itertools/itertools8.py +18 -0
- pythonlings/curriculum/exercises/json/json1.py +10 -0
- pythonlings/curriculum/exercises/json/json2.py +9 -0
- pythonlings/curriculum/exercises/json/json3.py +10 -0
- pythonlings/curriculum/exercises/json/json4.py +13 -0
- pythonlings/curriculum/exercises/json/json5.py +9 -0
- pythonlings/curriculum/exercises/json/json6.py +10 -0
- pythonlings/curriculum/exercises/json/json7.py +10 -0
- pythonlings/curriculum/exercises/json/json8.py +12 -0
- pythonlings/curriculum/exercises/lists/lists1.py +7 -0
- pythonlings/curriculum/exercises/lists/lists10.py +28 -0
- pythonlings/curriculum/exercises/lists/lists2.py +13 -0
- pythonlings/curriculum/exercises/lists/lists3.py +16 -0
- pythonlings/curriculum/exercises/lists/lists4.py +16 -0
- pythonlings/curriculum/exercises/lists/lists5.py +16 -0
- pythonlings/curriculum/exercises/lists/lists6.py +15 -0
- pythonlings/curriculum/exercises/lists/lists7.py +13 -0
- pythonlings/curriculum/exercises/lists/lists8.py +15 -0
- pythonlings/curriculum/exercises/lists/lists9.py +19 -0
- pythonlings/curriculum/exercises/loops/loops1.py +8 -0
- pythonlings/curriculum/exercises/loops/loops10.py +22 -0
- pythonlings/curriculum/exercises/loops/loops2.py +10 -0
- pythonlings/curriculum/exercises/loops/loops3.py +10 -0
- pythonlings/curriculum/exercises/loops/loops4.py +12 -0
- pythonlings/curriculum/exercises/loops/loops5.py +13 -0
- pythonlings/curriculum/exercises/loops/loops6.py +10 -0
- pythonlings/curriculum/exercises/loops/loops7.py +13 -0
- pythonlings/curriculum/exercises/loops/loops8.py +11 -0
- pythonlings/curriculum/exercises/loops/loops9.py +11 -0
- pythonlings/curriculum/exercises/modules/modules1.py +10 -0
- pythonlings/curriculum/exercises/modules/modules2.py +10 -0
- pythonlings/curriculum/exercises/modules/modules3.py +13 -0
- pythonlings/curriculum/exercises/modules/modules4.py +18 -0
- pythonlings/curriculum/exercises/modules/modules5.py +17 -0
- pythonlings/curriculum/exercises/modules/modules6.py +12 -0
- pythonlings/curriculum/exercises/modules/modules7.py +16 -0
- pythonlings/curriculum/exercises/modules/modules8.py +23 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced1.py +11 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced10.py +18 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced11.py +13 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced12.py +12 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced2.py +13 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced3.py +22 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced4.py +12 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced5.py +11 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced6.py +12 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced7.py +14 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced8.py +14 -0
- pythonlings/curriculum/exercises/oop_advanced/oop_advanced9.py +9 -0
- pythonlings/curriculum/exercises/pathlib/pathlib1.py +9 -0
- pythonlings/curriculum/exercises/pathlib/pathlib2.py +9 -0
- pythonlings/curriculum/exercises/pathlib/pathlib3.py +11 -0
- pythonlings/curriculum/exercises/pathlib/pathlib4.py +9 -0
- pythonlings/curriculum/exercises/pathlib/pathlib5.py +9 -0
- pythonlings/curriculum/exercises/pathlib/pathlib6.py +10 -0
- pythonlings/curriculum/exercises/recursion/recursion1.py +12 -0
- pythonlings/curriculum/exercises/recursion/recursion2.py +12 -0
- pythonlings/curriculum/exercises/recursion/recursion3.py +12 -0
- pythonlings/curriculum/exercises/recursion/recursion4.py +12 -0
- pythonlings/curriculum/exercises/recursion/recursion5.py +14 -0
- pythonlings/curriculum/exercises/recursion/recursion6.py +13 -0
- pythonlings/curriculum/exercises/recursion/recursion7.py +20 -0
- pythonlings/curriculum/exercises/recursion/recursion8.py +27 -0
- pythonlings/curriculum/exercises/regex/regex1.py +16 -0
- pythonlings/curriculum/exercises/regex/regex10.py +31 -0
- pythonlings/curriculum/exercises/regex/regex2.py +16 -0
- pythonlings/curriculum/exercises/regex/regex3.py +16 -0
- pythonlings/curriculum/exercises/regex/regex4.py +19 -0
- pythonlings/curriculum/exercises/regex/regex5.py +19 -0
- pythonlings/curriculum/exercises/regex/regex6.py +23 -0
- pythonlings/curriculum/exercises/regex/regex7.py +24 -0
- pythonlings/curriculum/exercises/regex/regex8.py +19 -0
- pythonlings/curriculum/exercises/regex/regex9.py +22 -0
- pythonlings/curriculum/exercises/sets/sets1.py +6 -0
- pythonlings/curriculum/exercises/sets/sets10.py +21 -0
- pythonlings/curriculum/exercises/sets/sets2.py +12 -0
- pythonlings/curriculum/exercises/sets/sets3.py +15 -0
- pythonlings/curriculum/exercises/sets/sets4.py +14 -0
- pythonlings/curriculum/exercises/sets/sets5.py +14 -0
- pythonlings/curriculum/exercises/sets/sets6.py +14 -0
- pythonlings/curriculum/exercises/sets/sets7.py +16 -0
- pythonlings/curriculum/exercises/sets/sets8.py +16 -0
- pythonlings/curriculum/exercises/sets/sets9.py +15 -0
- pythonlings/curriculum/exercises/strings/strings1.py +6 -0
- pythonlings/curriculum/exercises/strings/strings10.py +11 -0
- pythonlings/curriculum/exercises/strings/strings2.py +9 -0
- pythonlings/curriculum/exercises/strings/strings3.py +9 -0
- pythonlings/curriculum/exercises/strings/strings4.py +8 -0
- pythonlings/curriculum/exercises/strings/strings5.py +10 -0
- pythonlings/curriculum/exercises/strings/strings6.py +10 -0
- pythonlings/curriculum/exercises/strings/strings7.py +10 -0
- pythonlings/curriculum/exercises/strings/strings8.py +9 -0
- pythonlings/curriculum/exercises/strings/strings9.py +10 -0
- pythonlings/curriculum/exercises/testing/testing1.py +16 -0
- pythonlings/curriculum/exercises/testing/testing10.py +21 -0
- pythonlings/curriculum/exercises/testing/testing11.py +27 -0
- pythonlings/curriculum/exercises/testing/testing12.py +51 -0
- pythonlings/curriculum/exercises/testing/testing2.py +15 -0
- pythonlings/curriculum/exercises/testing/testing3.py +19 -0
- pythonlings/curriculum/exercises/testing/testing4.py +19 -0
- pythonlings/curriculum/exercises/testing/testing5.py +18 -0
- pythonlings/curriculum/exercises/testing/testing6.py +27 -0
- pythonlings/curriculum/exercises/testing/testing7.py +27 -0
- pythonlings/curriculum/exercises/testing/testing8.py +29 -0
- pythonlings/curriculum/exercises/testing/testing9.py +30 -0
- pythonlings/curriculum/exercises/tuples/tuples1.py +7 -0
- pythonlings/curriculum/exercises/tuples/tuples10.py +26 -0
- pythonlings/curriculum/exercises/tuples/tuples2.py +11 -0
- pythonlings/curriculum/exercises/tuples/tuples3.py +9 -0
- pythonlings/curriculum/exercises/tuples/tuples4.py +8 -0
- pythonlings/curriculum/exercises/tuples/tuples5.py +12 -0
- pythonlings/curriculum/exercises/tuples/tuples6.py +15 -0
- pythonlings/curriculum/exercises/tuples/tuples7.py +14 -0
- pythonlings/curriculum/exercises/tuples/tuples8.py +13 -0
- pythonlings/curriculum/exercises/tuples/tuples9.py +18 -0
- pythonlings/curriculum/exercises/type_hints/type_hints1.py +9 -0
- pythonlings/curriculum/exercises/type_hints/type_hints2.py +13 -0
- pythonlings/curriculum/exercises/type_hints/type_hints3.py +13 -0
- pythonlings/curriculum/exercises/type_hints/type_hints4.py +21 -0
- pythonlings/curriculum/exercises/type_hints/type_hints5.py +15 -0
- pythonlings/curriculum/exercises/type_hints/type_hints6.py +16 -0
- pythonlings/curriculum/exercises/type_hints/type_hints7.py +19 -0
- pythonlings/curriculum/exercises/type_hints/type_hints8.py +27 -0
- pythonlings/curriculum/exercises/variables/variables1.py +10 -0
- pythonlings/curriculum/exercises/variables/variables10.py +14 -0
- pythonlings/curriculum/exercises/variables/variables2.py +11 -0
- pythonlings/curriculum/exercises/variables/variables3.py +11 -0
- pythonlings/curriculum/exercises/variables/variables4.py +9 -0
- pythonlings/curriculum/exercises/variables/variables5.py +11 -0
- pythonlings/curriculum/exercises/variables/variables6.py +9 -0
- pythonlings/curriculum/exercises/variables/variables7.py +10 -0
- pythonlings/curriculum/exercises/variables/variables8.py +12 -0
- pythonlings/curriculum/exercises/variables/variables9.py +10 -0
- pythonlings/curriculum/info.toml +1755 -0
- pythonlings/curriculum/solutions/.keep +1 -0
- pythonlings/curriculum/solutions/_answers.py +1654 -0
- pythonlings/curriculum/solutions/async1.py +2 -0
- pythonlings/curriculum/solutions/async10.py +2 -0
- pythonlings/curriculum/solutions/async2.py +2 -0
- pythonlings/curriculum/solutions/async3.py +2 -0
- pythonlings/curriculum/solutions/async4.py +2 -0
- pythonlings/curriculum/solutions/async5.py +2 -0
- pythonlings/curriculum/solutions/async6.py +2 -0
- pythonlings/curriculum/solutions/async7.py +2 -0
- pythonlings/curriculum/solutions/async8.py +2 -0
- pythonlings/curriculum/solutions/async9.py +2 -0
- pythonlings/curriculum/solutions/classes1.py +2 -0
- pythonlings/curriculum/solutions/classes10.py +2 -0
- pythonlings/curriculum/solutions/classes11.py +2 -0
- pythonlings/curriculum/solutions/classes12.py +2 -0
- pythonlings/curriculum/solutions/classes2.py +2 -0
- pythonlings/curriculum/solutions/classes3.py +2 -0
- pythonlings/curriculum/solutions/classes4.py +2 -0
- pythonlings/curriculum/solutions/classes5.py +2 -0
- pythonlings/curriculum/solutions/classes6.py +2 -0
- pythonlings/curriculum/solutions/classes7.py +2 -0
- pythonlings/curriculum/solutions/classes8.py +2 -0
- pythonlings/curriculum/solutions/classes9.py +2 -0
- pythonlings/curriculum/solutions/collections1.py +2 -0
- pythonlings/curriculum/solutions/collections10.py +2 -0
- pythonlings/curriculum/solutions/collections2.py +2 -0
- pythonlings/curriculum/solutions/collections3.py +2 -0
- pythonlings/curriculum/solutions/collections4.py +2 -0
- pythonlings/curriculum/solutions/collections5.py +2 -0
- pythonlings/curriculum/solutions/collections6.py +2 -0
- pythonlings/curriculum/solutions/collections7.py +2 -0
- pythonlings/curriculum/solutions/collections8.py +2 -0
- pythonlings/curriculum/solutions/collections9.py +2 -0
- pythonlings/curriculum/solutions/comprehensions1.py +2 -0
- pythonlings/curriculum/solutions/comprehensions10.py +2 -0
- pythonlings/curriculum/solutions/comprehensions2.py +2 -0
- pythonlings/curriculum/solutions/comprehensions3.py +2 -0
- pythonlings/curriculum/solutions/comprehensions4.py +2 -0
- pythonlings/curriculum/solutions/comprehensions5.py +2 -0
- pythonlings/curriculum/solutions/comprehensions6.py +2 -0
- pythonlings/curriculum/solutions/comprehensions7.py +2 -0
- pythonlings/curriculum/solutions/comprehensions8.py +2 -0
- pythonlings/curriculum/solutions/comprehensions9.py +2 -0
- pythonlings/curriculum/solutions/conditionals1.py +2 -0
- pythonlings/curriculum/solutions/conditionals10.py +2 -0
- pythonlings/curriculum/solutions/conditionals2.py +2 -0
- pythonlings/curriculum/solutions/conditionals3.py +2 -0
- pythonlings/curriculum/solutions/conditionals4.py +2 -0
- pythonlings/curriculum/solutions/conditionals5.py +2 -0
- pythonlings/curriculum/solutions/conditionals6.py +2 -0
- pythonlings/curriculum/solutions/conditionals7.py +2 -0
- pythonlings/curriculum/solutions/conditionals8.py +2 -0
- pythonlings/curriculum/solutions/conditionals9.py +2 -0
- pythonlings/curriculum/solutions/context_managers1.py +2 -0
- pythonlings/curriculum/solutions/context_managers2.py +2 -0
- pythonlings/curriculum/solutions/context_managers3.py +2 -0
- pythonlings/curriculum/solutions/context_managers4.py +2 -0
- pythonlings/curriculum/solutions/context_managers5.py +2 -0
- pythonlings/curriculum/solutions/context_managers6.py +2 -0
- pythonlings/curriculum/solutions/context_managers7.py +2 -0
- pythonlings/curriculum/solutions/context_managers8.py +2 -0
- pythonlings/curriculum/solutions/dataclasses1.py +2 -0
- pythonlings/curriculum/solutions/dataclasses2.py +2 -0
- pythonlings/curriculum/solutions/dataclasses3.py +2 -0
- pythonlings/curriculum/solutions/dataclasses4.py +2 -0
- pythonlings/curriculum/solutions/dataclasses5.py +2 -0
- pythonlings/curriculum/solutions/dataclasses6.py +2 -0
- pythonlings/curriculum/solutions/dataclasses7.py +2 -0
- pythonlings/curriculum/solutions/dataclasses8.py +2 -0
- pythonlings/curriculum/solutions/datetime1.py +2 -0
- pythonlings/curriculum/solutions/datetime2.py +2 -0
- pythonlings/curriculum/solutions/datetime3.py +2 -0
- pythonlings/curriculum/solutions/datetime4.py +2 -0
- pythonlings/curriculum/solutions/datetime5.py +2 -0
- pythonlings/curriculum/solutions/datetime6.py +2 -0
- pythonlings/curriculum/solutions/datetime7.py +2 -0
- pythonlings/curriculum/solutions/datetime8.py +2 -0
- pythonlings/curriculum/solutions/decorators1.py +2 -0
- pythonlings/curriculum/solutions/decorators10.py +2 -0
- pythonlings/curriculum/solutions/decorators2.py +2 -0
- pythonlings/curriculum/solutions/decorators3.py +2 -0
- pythonlings/curriculum/solutions/decorators4.py +2 -0
- pythonlings/curriculum/solutions/decorators5.py +2 -0
- pythonlings/curriculum/solutions/decorators6.py +2 -0
- pythonlings/curriculum/solutions/decorators7.py +2 -0
- pythonlings/curriculum/solutions/decorators8.py +2 -0
- pythonlings/curriculum/solutions/decorators9.py +2 -0
- pythonlings/curriculum/solutions/dictionaries1.py +2 -0
- pythonlings/curriculum/solutions/dictionaries10.py +2 -0
- pythonlings/curriculum/solutions/dictionaries2.py +2 -0
- pythonlings/curriculum/solutions/dictionaries3.py +2 -0
- pythonlings/curriculum/solutions/dictionaries4.py +2 -0
- pythonlings/curriculum/solutions/dictionaries5.py +2 -0
- pythonlings/curriculum/solutions/dictionaries6.py +2 -0
- pythonlings/curriculum/solutions/dictionaries7.py +2 -0
- pythonlings/curriculum/solutions/dictionaries8.py +2 -0
- pythonlings/curriculum/solutions/dictionaries9.py +2 -0
- pythonlings/curriculum/solutions/enums1.py +2 -0
- pythonlings/curriculum/solutions/enums2.py +2 -0
- pythonlings/curriculum/solutions/enums3.py +2 -0
- pythonlings/curriculum/solutions/enums4.py +2 -0
- pythonlings/curriculum/solutions/enums5.py +2 -0
- pythonlings/curriculum/solutions/enums6.py +2 -0
- pythonlings/curriculum/solutions/exceptions1.py +2 -0
- pythonlings/curriculum/solutions/exceptions10.py +2 -0
- pythonlings/curriculum/solutions/exceptions2.py +2 -0
- pythonlings/curriculum/solutions/exceptions3.py +2 -0
- pythonlings/curriculum/solutions/exceptions4.py +2 -0
- pythonlings/curriculum/solutions/exceptions5.py +2 -0
- pythonlings/curriculum/solutions/exceptions6.py +2 -0
- pythonlings/curriculum/solutions/exceptions7.py +2 -0
- pythonlings/curriculum/solutions/exceptions8.py +2 -0
- pythonlings/curriculum/solutions/exceptions9.py +2 -0
- pythonlings/curriculum/solutions/file_io1.py +2 -0
- pythonlings/curriculum/solutions/file_io10.py +2 -0
- pythonlings/curriculum/solutions/file_io2.py +2 -0
- pythonlings/curriculum/solutions/file_io3.py +2 -0
- pythonlings/curriculum/solutions/file_io4.py +2 -0
- pythonlings/curriculum/solutions/file_io5.py +2 -0
- pythonlings/curriculum/solutions/file_io6.py +2 -0
- pythonlings/curriculum/solutions/file_io7.py +2 -0
- pythonlings/curriculum/solutions/file_io8.py +2 -0
- pythonlings/curriculum/solutions/file_io9.py +2 -0
- pythonlings/curriculum/solutions/functional1.py +2 -0
- pythonlings/curriculum/solutions/functional10.py +2 -0
- pythonlings/curriculum/solutions/functional2.py +2 -0
- pythonlings/curriculum/solutions/functional3.py +2 -0
- pythonlings/curriculum/solutions/functional4.py +2 -0
- pythonlings/curriculum/solutions/functional5.py +2 -0
- pythonlings/curriculum/solutions/functional6.py +2 -0
- pythonlings/curriculum/solutions/functional7.py +2 -0
- pythonlings/curriculum/solutions/functional8.py +2 -0
- pythonlings/curriculum/solutions/functional9.py +2 -0
- pythonlings/curriculum/solutions/functions1.py +2 -0
- pythonlings/curriculum/solutions/functions10.py +2 -0
- pythonlings/curriculum/solutions/functions2.py +2 -0
- pythonlings/curriculum/solutions/functions3.py +2 -0
- pythonlings/curriculum/solutions/functions4.py +2 -0
- pythonlings/curriculum/solutions/functions5.py +2 -0
- pythonlings/curriculum/solutions/functions6.py +2 -0
- pythonlings/curriculum/solutions/functions7.py +2 -0
- pythonlings/curriculum/solutions/functions8.py +2 -0
- pythonlings/curriculum/solutions/functions9.py +2 -0
- pythonlings/curriculum/solutions/generators1.py +2 -0
- pythonlings/curriculum/solutions/generators10.py +2 -0
- pythonlings/curriculum/solutions/generators2.py +2 -0
- pythonlings/curriculum/solutions/generators3.py +2 -0
- pythonlings/curriculum/solutions/generators4.py +2 -0
- pythonlings/curriculum/solutions/generators5.py +2 -0
- pythonlings/curriculum/solutions/generators6.py +2 -0
- pythonlings/curriculum/solutions/generators7.py +2 -0
- pythonlings/curriculum/solutions/generators8.py +2 -0
- pythonlings/curriculum/solutions/generators9.py +2 -0
- pythonlings/curriculum/solutions/itertools1.py +2 -0
- pythonlings/curriculum/solutions/itertools2.py +2 -0
- pythonlings/curriculum/solutions/itertools3.py +2 -0
- pythonlings/curriculum/solutions/itertools4.py +2 -0
- pythonlings/curriculum/solutions/itertools5.py +2 -0
- pythonlings/curriculum/solutions/itertools6.py +2 -0
- pythonlings/curriculum/solutions/itertools7.py +2 -0
- pythonlings/curriculum/solutions/itertools8.py +2 -0
- pythonlings/curriculum/solutions/json1.py +2 -0
- pythonlings/curriculum/solutions/json2.py +2 -0
- pythonlings/curriculum/solutions/json3.py +2 -0
- pythonlings/curriculum/solutions/json4.py +2 -0
- pythonlings/curriculum/solutions/json5.py +2 -0
- pythonlings/curriculum/solutions/json6.py +2 -0
- pythonlings/curriculum/solutions/json7.py +2 -0
- pythonlings/curriculum/solutions/json8.py +2 -0
- pythonlings/curriculum/solutions/lists1.py +2 -0
- pythonlings/curriculum/solutions/lists10.py +2 -0
- pythonlings/curriculum/solutions/lists2.py +2 -0
- pythonlings/curriculum/solutions/lists3.py +2 -0
- pythonlings/curriculum/solutions/lists4.py +2 -0
- pythonlings/curriculum/solutions/lists5.py +2 -0
- pythonlings/curriculum/solutions/lists6.py +2 -0
- pythonlings/curriculum/solutions/lists7.py +2 -0
- pythonlings/curriculum/solutions/lists8.py +2 -0
- pythonlings/curriculum/solutions/lists9.py +2 -0
- pythonlings/curriculum/solutions/loops1.py +2 -0
- pythonlings/curriculum/solutions/loops10.py +2 -0
- pythonlings/curriculum/solutions/loops2.py +2 -0
- pythonlings/curriculum/solutions/loops3.py +2 -0
- pythonlings/curriculum/solutions/loops4.py +2 -0
- pythonlings/curriculum/solutions/loops5.py +2 -0
- pythonlings/curriculum/solutions/loops6.py +2 -0
- pythonlings/curriculum/solutions/loops7.py +2 -0
- pythonlings/curriculum/solutions/loops8.py +2 -0
- pythonlings/curriculum/solutions/loops9.py +2 -0
- pythonlings/curriculum/solutions/modules1.py +2 -0
- pythonlings/curriculum/solutions/modules2.py +2 -0
- pythonlings/curriculum/solutions/modules3.py +2 -0
- pythonlings/curriculum/solutions/modules4.py +2 -0
- pythonlings/curriculum/solutions/modules5.py +2 -0
- pythonlings/curriculum/solutions/modules6.py +2 -0
- pythonlings/curriculum/solutions/modules7.py +2 -0
- pythonlings/curriculum/solutions/modules8.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced1.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced10.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced11.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced12.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced2.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced3.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced4.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced5.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced6.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced7.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced8.py +2 -0
- pythonlings/curriculum/solutions/oop_advanced9.py +2 -0
- pythonlings/curriculum/solutions/pathlib1.py +2 -0
- pythonlings/curriculum/solutions/pathlib2.py +2 -0
- pythonlings/curriculum/solutions/pathlib3.py +2 -0
- pythonlings/curriculum/solutions/pathlib4.py +2 -0
- pythonlings/curriculum/solutions/pathlib5.py +2 -0
- pythonlings/curriculum/solutions/pathlib6.py +2 -0
- pythonlings/curriculum/solutions/recursion1.py +2 -0
- pythonlings/curriculum/solutions/recursion2.py +2 -0
- pythonlings/curriculum/solutions/recursion3.py +2 -0
- pythonlings/curriculum/solutions/recursion4.py +2 -0
- pythonlings/curriculum/solutions/recursion5.py +2 -0
- pythonlings/curriculum/solutions/recursion6.py +2 -0
- pythonlings/curriculum/solutions/recursion7.py +2 -0
- pythonlings/curriculum/solutions/recursion8.py +2 -0
- pythonlings/curriculum/solutions/regex1.py +2 -0
- pythonlings/curriculum/solutions/regex10.py +2 -0
- pythonlings/curriculum/solutions/regex2.py +2 -0
- pythonlings/curriculum/solutions/regex3.py +2 -0
- pythonlings/curriculum/solutions/regex4.py +2 -0
- pythonlings/curriculum/solutions/regex5.py +2 -0
- pythonlings/curriculum/solutions/regex6.py +2 -0
- pythonlings/curriculum/solutions/regex7.py +2 -0
- pythonlings/curriculum/solutions/regex8.py +2 -0
- pythonlings/curriculum/solutions/regex9.py +2 -0
- pythonlings/curriculum/solutions/sets1.py +2 -0
- pythonlings/curriculum/solutions/sets10.py +2 -0
- pythonlings/curriculum/solutions/sets2.py +2 -0
- pythonlings/curriculum/solutions/sets3.py +2 -0
- pythonlings/curriculum/solutions/sets4.py +2 -0
- pythonlings/curriculum/solutions/sets5.py +2 -0
- pythonlings/curriculum/solutions/sets6.py +2 -0
- pythonlings/curriculum/solutions/sets7.py +2 -0
- pythonlings/curriculum/solutions/sets8.py +2 -0
- pythonlings/curriculum/solutions/sets9.py +2 -0
- pythonlings/curriculum/solutions/strings1.py +2 -0
- pythonlings/curriculum/solutions/strings10.py +2 -0
- pythonlings/curriculum/solutions/strings2.py +2 -0
- pythonlings/curriculum/solutions/strings3.py +2 -0
- pythonlings/curriculum/solutions/strings4.py +2 -0
- pythonlings/curriculum/solutions/strings5.py +2 -0
- pythonlings/curriculum/solutions/strings6.py +2 -0
- pythonlings/curriculum/solutions/strings7.py +2 -0
- pythonlings/curriculum/solutions/strings8.py +2 -0
- pythonlings/curriculum/solutions/strings9.py +2 -0
- pythonlings/curriculum/solutions/testing1.py +2 -0
- pythonlings/curriculum/solutions/testing10.py +2 -0
- pythonlings/curriculum/solutions/testing11.py +2 -0
- pythonlings/curriculum/solutions/testing12.py +2 -0
- pythonlings/curriculum/solutions/testing2.py +2 -0
- pythonlings/curriculum/solutions/testing3.py +2 -0
- pythonlings/curriculum/solutions/testing4.py +2 -0
- pythonlings/curriculum/solutions/testing5.py +2 -0
- pythonlings/curriculum/solutions/testing6.py +2 -0
- pythonlings/curriculum/solutions/testing7.py +2 -0
- pythonlings/curriculum/solutions/testing8.py +2 -0
- pythonlings/curriculum/solutions/testing9.py +2 -0
- pythonlings/curriculum/solutions/tuples1.py +2 -0
- pythonlings/curriculum/solutions/tuples10.py +2 -0
- pythonlings/curriculum/solutions/tuples2.py +2 -0
- pythonlings/curriculum/solutions/tuples3.py +2 -0
- pythonlings/curriculum/solutions/tuples4.py +2 -0
- pythonlings/curriculum/solutions/tuples5.py +2 -0
- pythonlings/curriculum/solutions/tuples6.py +2 -0
- pythonlings/curriculum/solutions/tuples7.py +2 -0
- pythonlings/curriculum/solutions/tuples8.py +2 -0
- pythonlings/curriculum/solutions/tuples9.py +2 -0
- pythonlings/curriculum/solutions/type_hints1.py +2 -0
- pythonlings/curriculum/solutions/type_hints2.py +2 -0
- pythonlings/curriculum/solutions/type_hints3.py +2 -0
- pythonlings/curriculum/solutions/type_hints4.py +2 -0
- pythonlings/curriculum/solutions/type_hints5.py +2 -0
- pythonlings/curriculum/solutions/type_hints6.py +2 -0
- pythonlings/curriculum/solutions/type_hints7.py +2 -0
- pythonlings/curriculum/solutions/type_hints8.py +2 -0
- pythonlings/curriculum/solutions/variables1.py +2 -0
- pythonlings/curriculum/solutions/variables10.py +2 -0
- pythonlings/curriculum/solutions/variables2.py +2 -0
- pythonlings/curriculum/solutions/variables3.py +2 -0
- pythonlings/curriculum/solutions/variables4.py +2 -0
- pythonlings/curriculum/solutions/variables5.py +2 -0
- pythonlings/curriculum/solutions/variables6.py +2 -0
- pythonlings/curriculum/solutions/variables7.py +2 -0
- pythonlings/curriculum/solutions/variables8.py +2 -0
- pythonlings/curriculum/solutions/variables9.py +2 -0
- pythonlings/docs/NOTICE.md +9 -0
- pythonlings/docs/__init__.py +1 -0
- pythonlings/docs/index.json +160 -0
- pythonlings/docs/topics/__init__.py +1 -0
- pythonlings/docs/topics/async.md +97 -0
- pythonlings/docs/topics/classes.md +97 -0
- pythonlings/docs/topics/collections.md +96 -0
- pythonlings/docs/topics/comprehensions.md +97 -0
- pythonlings/docs/topics/conditionals.md +88 -0
- pythonlings/docs/topics/context_managers.md +97 -0
- pythonlings/docs/topics/dataclasses.md +97 -0
- pythonlings/docs/topics/datetime.md +97 -0
- pythonlings/docs/topics/decorators.md +91 -0
- pythonlings/docs/topics/dictionaries.md +96 -0
- pythonlings/docs/topics/enums.md +96 -0
- pythonlings/docs/topics/exceptions.md +96 -0
- pythonlings/docs/topics/file_io.md +96 -0
- pythonlings/docs/topics/functional.md +96 -0
- pythonlings/docs/topics/functions.md +97 -0
- pythonlings/docs/topics/generators.md +97 -0
- pythonlings/docs/topics/itertools.md +96 -0
- pythonlings/docs/topics/json.md +97 -0
- pythonlings/docs/topics/lists.md +97 -0
- pythonlings/docs/topics/loops.md +95 -0
- pythonlings/docs/topics/modules.md +97 -0
- pythonlings/docs/topics/oop_advanced.md +71 -0
- pythonlings/docs/topics/pathlib.md +79 -0
- pythonlings/docs/topics/recursion.md +73 -0
- pythonlings/docs/topics/regex.md +96 -0
- pythonlings/docs/topics/sets.md +97 -0
- pythonlings/docs/topics/strings.md +96 -0
- pythonlings/docs/topics/testing.md +97 -0
- pythonlings/docs/topics/tuples.md +97 -0
- pythonlings/docs/topics/type_hints.md +97 -0
- pythonlings/docs/topics/variables.md +97 -0
- pythonlings/pythonlings.tcss +123 -0
- pythonlings/screens/__init__.py +0 -0
- pythonlings/screens/docs.py +93 -0
- pythonlings/screens/topic_picker.py +107 -0
- pythonlings/screens/track.py +234 -0
- pythonlings/widgets/__init__.py +0 -0
- pythonlings/widgets/editor_pane.py +33 -0
- pythonlings/widgets/exercise_tree.py +33 -0
- pythonlings/widgets/output_panel.py +180 -0
- pythonlings/widgets/progress.py +15 -0
- pythonlings-0.3.0.dist-info/METADATA +259 -0
- pythonlings-0.3.0.dist-info/RECORD +942 -0
- pythonlings-0.3.0.dist-info/WHEEL +4 -0
- pythonlings-0.3.0.dist-info/entry_points.txt +2 -0
- pythonlings-0.3.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Exercise: Dictionaries 6
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# `.get(key, default)` returns the value for a key if it exists,
|
|
5
|
+
# or the default if the key is missing — without raising a KeyError.
|
|
6
|
+
#
|
|
7
|
+
# Given `config` below:
|
|
8
|
+
# `timeout` — get "timeout" with a default of 30
|
|
9
|
+
# `retries` — get "retries" with a default of 3
|
|
10
|
+
# `verbose` — get "verbose" with a default of False
|
|
11
|
+
#
|
|
12
|
+
# "timeout" exists in config, "retries" and "verbose" do not.
|
|
13
|
+
|
|
14
|
+
config = {"host": "localhost", "port": 8080, "timeout": 60}
|
|
15
|
+
|
|
16
|
+
timeout = ???
|
|
17
|
+
retries = ???
|
|
18
|
+
verbose = ???
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Exercise: Dictionaries 7
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Iterate over a dictionary to compute a summary.
|
|
5
|
+
#
|
|
6
|
+
# Given `prices` below, build `discounted` — a new dict where every
|
|
7
|
+
# value is reduced by 10% (multiply each price by 0.9).
|
|
8
|
+
# Round each result to 2 decimal places.
|
|
9
|
+
#
|
|
10
|
+
# Expected:
|
|
11
|
+
# discounted == {"apple": 0.9, "milk": 1.35, "bread": 2.25}
|
|
12
|
+
|
|
13
|
+
prices = {"apple": 1.0, "milk": 1.5, "bread": 2.5}
|
|
14
|
+
|
|
15
|
+
discounted = {}
|
|
16
|
+
for ???:
|
|
17
|
+
???
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Exercise: Dictionaries 8
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Use the `in` operator to test key membership in a dict.
|
|
5
|
+
#
|
|
6
|
+
# Given `permissions` below, set:
|
|
7
|
+
# `can_read` — True if "read" is a key in permissions, False otherwise
|
|
8
|
+
# `can_write` — True if "write" is a key in permissions, False otherwise
|
|
9
|
+
# `can_delete` — True if "delete" is a key in permissions, False otherwise
|
|
10
|
+
#
|
|
11
|
+
# Do NOT hard-code True/False — use `in` expressions.
|
|
12
|
+
|
|
13
|
+
permissions = {"read": True, "write": False}
|
|
14
|
+
|
|
15
|
+
can_read = ???
|
|
16
|
+
can_write = ???
|
|
17
|
+
can_delete = ???
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Exercise: Dictionaries 9
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# A nested dict is a dict whose values are themselves dicts.
|
|
5
|
+
#
|
|
6
|
+
# Given `school` below, set:
|
|
7
|
+
# `alice_grade` — Alice's grade (school["students"]["alice"]["grade"])
|
|
8
|
+
# `math_room` — the room number for math (school["courses"]["math"]["room"])
|
|
9
|
+
# `num_students` — the total enrollment count (school["meta"]["enrollment"])
|
|
10
|
+
|
|
11
|
+
school = {
|
|
12
|
+
"students": {
|
|
13
|
+
"alice": {"grade": "A", "age": 20},
|
|
14
|
+
"bob": {"grade": "B", "age": 22},
|
|
15
|
+
},
|
|
16
|
+
"courses": {
|
|
17
|
+
"math": {"room": 101, "credits": 3},
|
|
18
|
+
"english": {"room": 205, "credits": 3},
|
|
19
|
+
},
|
|
20
|
+
"meta": {"enrollment": 350, "founded": 1990},
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
alice_grade = ???
|
|
24
|
+
math_room = ???
|
|
25
|
+
num_students = ???
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Exercise: Enums 5
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Goal: Return True only for terminal ticket states.
|
|
5
|
+
|
|
6
|
+
from enum import Enum, auto
|
|
7
|
+
|
|
8
|
+
class TicketState(Enum):
|
|
9
|
+
OPEN = auto()
|
|
10
|
+
CLOSED = auto()
|
|
11
|
+
CANCELLED = auto()
|
|
12
|
+
|
|
13
|
+
def is_terminal(state):
|
|
14
|
+
return ???
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Exercise: Enums 6
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Goal: Give each Direction member a delta tuple and return it from a method.
|
|
5
|
+
|
|
6
|
+
from enum import Enum
|
|
7
|
+
|
|
8
|
+
class Direction(Enum):
|
|
9
|
+
NORTH = (0, -1)
|
|
10
|
+
SOUTH = (0, 1)
|
|
11
|
+
EAST = (1, 0)
|
|
12
|
+
WEST = (-1, 0)
|
|
13
|
+
|
|
14
|
+
def delta(self):
|
|
15
|
+
return ???
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Exercise: Exceptions 1
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Complete safe_divide(a, b) so that dividing by zero is caught and
|
|
5
|
+
# the function returns the string "error" instead of crashing.
|
|
6
|
+
# A normal division should return the numeric result.
|
|
7
|
+
#
|
|
8
|
+
# Wrap the body in a try/except block:
|
|
9
|
+
# try:
|
|
10
|
+
# ...
|
|
11
|
+
# except ZeroDivisionError:
|
|
12
|
+
# ...
|
|
13
|
+
|
|
14
|
+
def safe_divide(a, b):
|
|
15
|
+
return a / b
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Exercise: Exceptions 10
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Complete validate_username(name) which enforces three rules:
|
|
5
|
+
# 1. The name must be a str; if not, raise TypeError("username must be a str").
|
|
6
|
+
# 2. The name must be between 3 and 20 characters (inclusive); if not,
|
|
7
|
+
# raise ValueError("username must be 3–20 characters").
|
|
8
|
+
# 3. The name must contain only letters and digits (name.isalnum()); if not,
|
|
9
|
+
# raise ValueError("username must be alphanumeric").
|
|
10
|
+
#
|
|
11
|
+
# On success, return name.lower().
|
|
12
|
+
#
|
|
13
|
+
# Check the rules in the order listed above.
|
|
14
|
+
|
|
15
|
+
def validate_username(name):
|
|
16
|
+
# TODO: check type (raise TypeError if not str)
|
|
17
|
+
# TODO: check length (raise ValueError if out of 3–20 range)
|
|
18
|
+
# TODO: check alphanumeric (raise ValueError if not .isalnum())
|
|
19
|
+
return name.lower()
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Exercise: Exceptions 2
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Complete parse_number(s) so that it converts the string `s` to an int
|
|
5
|
+
# and returns it. If `s` cannot be converted (i.e. int(s) raises a
|
|
6
|
+
# ValueError), return -1 instead.
|
|
7
|
+
#
|
|
8
|
+
# Catch the *specific* exception:
|
|
9
|
+
# except ValueError:
|
|
10
|
+
|
|
11
|
+
def parse_number(s):
|
|
12
|
+
return int(s)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Exercise: Exceptions 3
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Complete describe_error(s) so that it tries to convert `s` to a float,
|
|
5
|
+
# returning the float on success. On failure it should return the string
|
|
6
|
+
# representation of the exception message (i.e. str(e)), NOT a fixed string.
|
|
7
|
+
#
|
|
8
|
+
# Capture the exception object with `as`:
|
|
9
|
+
# except ValueError as e:
|
|
10
|
+
# return str(e)
|
|
11
|
+
|
|
12
|
+
def describe_error(s):
|
|
13
|
+
return float(s)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Exercise: Exceptions 4
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Complete load_value(data, key) so it uses a try/except/else block:
|
|
5
|
+
# - try to retrieve data[key]
|
|
6
|
+
# - if a KeyError occurs, return the string "missing"
|
|
7
|
+
# - in the else clause (runs only when no exception occurred),
|
|
8
|
+
# return the value doubled (value * 2)
|
|
9
|
+
#
|
|
10
|
+
# The else clause of a try block runs when NO exception was raised.
|
|
11
|
+
|
|
12
|
+
def load_value(data, key):
|
|
13
|
+
try:
|
|
14
|
+
value = data[key]
|
|
15
|
+
except KeyError:
|
|
16
|
+
return "missing"
|
|
17
|
+
# TODO: add an else clause here that returns value * 2
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Exercise: Exceptions 5
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Complete read_first(items) using a try/finally block.
|
|
5
|
+
# - Try to return items[0].
|
|
6
|
+
# - If items is empty (IndexError), return None.
|
|
7
|
+
# - In the finally clause, append the string "done" to the module-level
|
|
8
|
+
# list `log` — this must happen whether or not an exception occurred.
|
|
9
|
+
#
|
|
10
|
+
# The finally clause runs ALWAYS, even when an exception is raised or
|
|
11
|
+
# a return is executed in the try block.
|
|
12
|
+
|
|
13
|
+
log = []
|
|
14
|
+
|
|
15
|
+
def read_first(items):
|
|
16
|
+
try:
|
|
17
|
+
return items[0]
|
|
18
|
+
except IndexError:
|
|
19
|
+
return None
|
|
20
|
+
# TODO: add a finally clause that does log.append("done")
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Exercise: Exceptions 6
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Complete require_positive(n) so that:
|
|
5
|
+
# - If n is greater than 0, return n.
|
|
6
|
+
# - Otherwise, raise a ValueError.
|
|
7
|
+
#
|
|
8
|
+
# Use the `raise` statement to throw an exception:
|
|
9
|
+
# raise ValueError
|
|
10
|
+
|
|
11
|
+
def require_positive(n):
|
|
12
|
+
# TODO: raise ValueError when n is not positive
|
|
13
|
+
return n
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Exercise: Exceptions 7
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Complete check_age(age) so that:
|
|
5
|
+
# - If age is between 0 and 120 (inclusive), return age.
|
|
6
|
+
# - Otherwise, raise a ValueError with the message:
|
|
7
|
+
# "age must be between 0 and 120"
|
|
8
|
+
#
|
|
9
|
+
# Pass a message string when raising:
|
|
10
|
+
# raise ValueError("your message here")
|
|
11
|
+
|
|
12
|
+
def check_age(age):
|
|
13
|
+
# TODO: raise ValueError with the message "age must be between 0 and 120"
|
|
14
|
+
# when age is out of range
|
|
15
|
+
return age
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Exercise: Exceptions 8
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Complete classify_error(func) so that it calls func() with no arguments
|
|
5
|
+
# and returns a string describing what happened:
|
|
6
|
+
# - If no exception: return "ok"
|
|
7
|
+
# - If a ValueError: return "value error"
|
|
8
|
+
# - If a TypeError: return "type error"
|
|
9
|
+
# - If any other exception: return "other error"
|
|
10
|
+
#
|
|
11
|
+
# Use multiple except clauses — each clause catches a different exception type.
|
|
12
|
+
|
|
13
|
+
def classify_error(func):
|
|
14
|
+
try:
|
|
15
|
+
func()
|
|
16
|
+
return "ok"
|
|
17
|
+
# TODO: add except clauses for ValueError, TypeError, and a catch-all
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Exercise: Exceptions 9
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Define a custom exception class called `InsufficientFundsError` that
|
|
5
|
+
# inherits from Exception.
|
|
6
|
+
#
|
|
7
|
+
# Then complete withdraw(balance, amount) so that:
|
|
8
|
+
# - If amount > balance, raise InsufficientFundsError with the message:
|
|
9
|
+
# "cannot withdraw <amount> from balance of <balance>"
|
|
10
|
+
# - Otherwise return balance - amount.
|
|
11
|
+
#
|
|
12
|
+
# A custom exception class looks like:
|
|
13
|
+
# class MyError(Exception):
|
|
14
|
+
# pass
|
|
15
|
+
|
|
16
|
+
# TODO: define InsufficientFundsError here
|
|
17
|
+
|
|
18
|
+
def withdraw(balance, amount):
|
|
19
|
+
# TODO: raise InsufficientFundsError when amount > balance
|
|
20
|
+
return balance - amount
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Exercise: File IO 1
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# `data_path` is an absolute path to a new temp file.
|
|
5
|
+
# Write the string "hello, file!" to that file using open() and .write().
|
|
6
|
+
# The file should contain exactly that text after you are done.
|
|
7
|
+
#
|
|
8
|
+
# Hint: open(path, "w") returns a file object; call .write(text) on it,
|
|
9
|
+
# then .close() it — or use a with statement.
|
|
10
|
+
|
|
11
|
+
import tempfile
|
|
12
|
+
|
|
13
|
+
data_path = tempfile.mktemp()
|
|
14
|
+
|
|
15
|
+
# Write "hello, file!" to data_path.
|
|
16
|
+
f = open(data_path, "w")
|
|
17
|
+
f.write(???)
|
|
18
|
+
f.close()
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Exercise: File IO 10
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# `src_path` contains three lines of mixed-case text.
|
|
5
|
+
# Copy the file to `dst_path`, converting every line to UPPERCASE.
|
|
6
|
+
# After your code runs, `dst_path` should contain the uppercased text.
|
|
7
|
+
#
|
|
8
|
+
# Steps:
|
|
9
|
+
# 1. Open src_path for reading.
|
|
10
|
+
# 2. Open dst_path for writing.
|
|
11
|
+
# 3. For each line read from src, write line.upper() to dst.
|
|
12
|
+
|
|
13
|
+
import tempfile
|
|
14
|
+
|
|
15
|
+
src_path = tempfile.mktemp()
|
|
16
|
+
dst_path = tempfile.mktemp()
|
|
17
|
+
|
|
18
|
+
with open(src_path, "w") as f:
|
|
19
|
+
f.write("hello world\npython is fun\nfile io rocks\n")
|
|
20
|
+
|
|
21
|
+
# Copy src_path to dst_path, converting each line to uppercase.
|
|
22
|
+
with open(src_path) as src:
|
|
23
|
+
with open(dst_path, "w") as dst:
|
|
24
|
+
for line in src:
|
|
25
|
+
dst.write(line) # TODO: write line.upper() instead of line
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Exercise: File IO 2
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# `note_path` points to a file that already contains the text "remember".
|
|
5
|
+
# Read the WHOLE file and store its text in the variable `contents`.
|
|
6
|
+
#
|
|
7
|
+
# Hint: open(path).read() returns the entire file as a string.
|
|
8
|
+
|
|
9
|
+
import tempfile
|
|
10
|
+
|
|
11
|
+
note_path = tempfile.mktemp()
|
|
12
|
+
with open(note_path, "w") as f:
|
|
13
|
+
f.write("remember")
|
|
14
|
+
|
|
15
|
+
# Read the whole file into `contents`.
|
|
16
|
+
contents = ???
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Exercise: File IO 3
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Use a `with` statement to open `log_path` for writing ("w") and write
|
|
5
|
+
# the string "first entry" to it. The `with` statement closes the file
|
|
6
|
+
# automatically when its block ends.
|
|
7
|
+
#
|
|
8
|
+
# Pattern:
|
|
9
|
+
# with open(path, "w") as fh:
|
|
10
|
+
# fh.write(text)
|
|
11
|
+
|
|
12
|
+
import tempfile
|
|
13
|
+
|
|
14
|
+
log_path = tempfile.mktemp()
|
|
15
|
+
|
|
16
|
+
# Replace the ??? so the with-block writes "first entry".
|
|
17
|
+
with open(log_path, "w") as fh:
|
|
18
|
+
fh.write(???)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Exercise: File IO 4
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# `poem_path` already contains three lines:
|
|
5
|
+
# "roses are red\n"
|
|
6
|
+
# "violets are blue\n"
|
|
7
|
+
# "python is great\n"
|
|
8
|
+
#
|
|
9
|
+
# Read ALL lines from the file and store them in the variable `lines`
|
|
10
|
+
# as a list of strings (newlines included, as .readlines() returns them).
|
|
11
|
+
#
|
|
12
|
+
# Hint: open(path).readlines() returns a list of lines.
|
|
13
|
+
|
|
14
|
+
import tempfile
|
|
15
|
+
|
|
16
|
+
poem_path = tempfile.mktemp()
|
|
17
|
+
with open(poem_path, "w") as f:
|
|
18
|
+
f.write("roses are red\nviolets are blue\npython is great\n")
|
|
19
|
+
|
|
20
|
+
# Read all lines into `lines`.
|
|
21
|
+
lines = open(poem_path).read() # TODO: use .readlines() instead of .read()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Exercise: File IO 5
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# `journal_path` already has the line "day 1: sunny\n" written to it.
|
|
5
|
+
# Open the same file in APPEND mode ("a") and write "day 2: rainy\n"
|
|
6
|
+
# so that both lines are present in the file.
|
|
7
|
+
#
|
|
8
|
+
# Append mode adds content after what already exists without erasing it.
|
|
9
|
+
# Using "w" would overwrite and lose the first line — use "a" instead.
|
|
10
|
+
|
|
11
|
+
import tempfile
|
|
12
|
+
|
|
13
|
+
journal_path = tempfile.mktemp()
|
|
14
|
+
with open(journal_path, "w") as f:
|
|
15
|
+
f.write("day 1: sunny\n")
|
|
16
|
+
|
|
17
|
+
# Append "day 2: rainy\n" to journal_path.
|
|
18
|
+
with open(journal_path, "w") as fh: # TODO: change "w" to "a"
|
|
19
|
+
fh.write("day 2: rainy\n")
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Exercise: File IO 6
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# `numbers_path` contains five numbers, one per line:
|
|
5
|
+
# 10, 20, 30, 40, 50
|
|
6
|
+
#
|
|
7
|
+
# Iterate over the lines of the file (using `for line in fh:`) and build
|
|
8
|
+
# `total` as the sum of the integer values.
|
|
9
|
+
#
|
|
10
|
+
# Hint: int(line.strip()) converts a line like "10\n" to the integer 10.
|
|
11
|
+
|
|
12
|
+
import tempfile
|
|
13
|
+
|
|
14
|
+
numbers_path = tempfile.mktemp()
|
|
15
|
+
with open(numbers_path, "w") as f:
|
|
16
|
+
f.write("10\n20\n30\n40\n50\n")
|
|
17
|
+
|
|
18
|
+
total = 0
|
|
19
|
+
# Iterate over the file's lines and add each integer value to total.
|
|
20
|
+
with open(numbers_path) as fh:
|
|
21
|
+
for line in fh:
|
|
22
|
+
total += line # TODO: convert line to int first (strip whitespace)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Exercise: File IO 7
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# You have a list of strings called `words`.
|
|
5
|
+
# Write them to `words_path` so that each word appears on its own line.
|
|
6
|
+
# The file should contain exactly:
|
|
7
|
+
# "alpha\nbeta\ngamma\n"
|
|
8
|
+
#
|
|
9
|
+
# Hint: fh.writelines(iterable) writes each item without adding newlines,
|
|
10
|
+
# so you need to ensure each string ends with "\n" before passing them in.
|
|
11
|
+
# Alternatively, use a loop: for w in words: fh.write(w + "\n")
|
|
12
|
+
|
|
13
|
+
import tempfile
|
|
14
|
+
|
|
15
|
+
words_path = tempfile.mktemp()
|
|
16
|
+
words = ["alpha", "beta", "gamma"]
|
|
17
|
+
|
|
18
|
+
# Write each word to words_path on its own line.
|
|
19
|
+
with open(words_path, "w") as fh:
|
|
20
|
+
fh.writelines(words) # TODO: each word needs a newline at the end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Exercise: File IO 8
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# `source_path` contains the text " Hello, World! " (with surrounding spaces).
|
|
5
|
+
# Read the file, strip the leading/trailing whitespace from the content,
|
|
6
|
+
# and store the cleaned text in `result`.
|
|
7
|
+
#
|
|
8
|
+
# Hint: str.strip() removes surrounding whitespace from a string.
|
|
9
|
+
|
|
10
|
+
import tempfile
|
|
11
|
+
|
|
12
|
+
source_path = tempfile.mktemp()
|
|
13
|
+
with open(source_path, "w") as f:
|
|
14
|
+
f.write(" Hello, World! ")
|
|
15
|
+
|
|
16
|
+
# Read the file and strip whitespace; store in `result`.
|
|
17
|
+
with open(source_path) as fh:
|
|
18
|
+
result = fh.read() # TODO: call .strip() on the result
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Exercise: File IO 9
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# `essay_path` contains a short text with multiple words.
|
|
5
|
+
# Count the total number of words in the file and store the count in
|
|
6
|
+
# the variable `word_count`.
|
|
7
|
+
#
|
|
8
|
+
# A word is any whitespace-separated token — str.split() with no
|
|
9
|
+
# argument splits on any whitespace and discards empty strings.
|
|
10
|
+
|
|
11
|
+
import tempfile
|
|
12
|
+
|
|
13
|
+
essay_path = tempfile.mktemp()
|
|
14
|
+
with open(essay_path, "w") as f:
|
|
15
|
+
f.write("the quick brown fox jumps over the lazy dog")
|
|
16
|
+
|
|
17
|
+
# Count the words in essay_path and store in `word_count`.
|
|
18
|
+
with open(essay_path) as fh:
|
|
19
|
+
word_count = len(fh.read()) # TODO: split into words before taking len()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Exercise: Functional 10
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Build a small data-processing pipeline using map, filter, and reduce.
|
|
5
|
+
#
|
|
6
|
+
# Given a list of raw scores (integers), compute `result` as follows:
|
|
7
|
+
# Step 1 — map: multiply every score by 2 (use map + lambda)
|
|
8
|
+
# Step 2 — filter: keep only scores > 10 (use filter + lambda)
|
|
9
|
+
# Step 3 — reduce: sum the remaining scores (use reduce + lambda)
|
|
10
|
+
#
|
|
11
|
+
# Replace each ??? with the correct lambda.
|
|
12
|
+
|
|
13
|
+
from functools import reduce
|
|
14
|
+
|
|
15
|
+
scores = [1, 3, 6, 2, 8, 4]
|
|
16
|
+
|
|
17
|
+
doubled = list(map(???, scores))
|
|
18
|
+
above_ten = list(filter(???, doubled))
|
|
19
|
+
result = reduce(???, above_ten)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Exercise: Functional 3
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Use `map()` to build `doubled` — a list where every number in `numbers`
|
|
5
|
+
# is multiplied by 2.
|
|
6
|
+
# `map(func, iterable)` applies `func` to each element.
|
|
7
|
+
# Remember to wrap the result in `list(...)`.
|
|
8
|
+
|
|
9
|
+
numbers = [1, 2, 3, 4, 5]
|
|
10
|
+
|
|
11
|
+
doubled = list(map(???, numbers))
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Exercise: Functional 4
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Use `filter()` to build `evens` — a list containing only the even numbers
|
|
5
|
+
# from `numbers`.
|
|
6
|
+
# `filter(func, iterable)` keeps elements where `func(element)` is truthy.
|
|
7
|
+
# Remember to wrap the result in `list(...)`.
|
|
8
|
+
|
|
9
|
+
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
10
|
+
|
|
11
|
+
evens = list(filter(???, numbers))
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Exercise: Functional 5
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# Sort `words` by the LENGTH of each word (shortest first).
|
|
5
|
+
# Use `sorted()` with the `key=` parameter.
|
|
6
|
+
# The key function receives one word and should return its length.
|
|
7
|
+
# Replace ??? with a lambda that returns the length of a word.
|
|
8
|
+
|
|
9
|
+
words = ["banana", "fig", "apple", "kiwi", "date"]
|
|
10
|
+
|
|
11
|
+
by_length = sorted(words, key=???)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Exercise: Functional 6
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# `apply_twice` should call `func` on `value`, then call `func` on that result.
|
|
5
|
+
# In other words: apply_twice(f, x) → f(f(x))
|
|
6
|
+
# Fill in the function body — replace `pass` with the correct return statement.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def apply_twice(func, value):
|
|
10
|
+
pass
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
triple = lambda x: x * 3
|
|
14
|
+
add_ten = lambda x: x + 10
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Exercise: Functional 7
|
|
2
|
+
# I AM NOT DONE
|
|
3
|
+
#
|
|
4
|
+
# `make_multiplier(n)` should RETURN a function that multiplies its argument by n.
|
|
5
|
+
# Example: triple = make_multiplier(3); triple(4) → 12
|
|
6
|
+
#
|
|
7
|
+
# Replace `pass` inside `make_multiplier` with a return statement that
|
|
8
|
+
# returns a lambda (or inner function) capturing `n`.
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def make_multiplier(n):
|
|
12
|
+
pass
|