1class ProtectedSection:
 2    """Еxecute a (relatively) error-free block of code."""
 3
 4    def __init__(self, log=(), suppress=()):
 5        self.log = log
 6        self.suppress = suppress
 7        self.exception = None
 8
 9    def __enter__(self):
10        self.exception = None
11        return self
12
13    def __exit__(self, exc_type, exc_val, exc_tb):
14        if exc_type:
15            if exc_type in self.log:
16                self.exception = exc_val
17                return True
18            elif exc_type in self.suppress:
19                return True
20        return False
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
|   
        Виктор Бечев
         09.11.2024 14:36`camelCase` _(в PEP8 го наричат `mixedCase`)_ не искаме да използваме никъде... Въпреки, че го има тук-таме в стандартната библиотека - `unittest.TestCase.assertEqual`, някъде в xml библиотеката и прочие. Това са legacy неща, така че въпреки, че противоречат на конвенцията - не са аргумент за това да пишем напук на PEP8.
`snake_case` са имената на променливите, атрибутите, функциите, методите. Почти всичко, с други думи.
`SCREAMING_SNAKE_CASE` ползваме за имена на константи както глобални, така и в контекста на класови атрибути.
И финално - `CamelCase`, но от хубавия, използваме само за класове. В случая е окей, а ако искахме контекстният ни мениджър да е в `snake_case`, както например `with open(file):`, тогава би следвало да направим следното:
```
class _ProtectedSection:
    ...
protected_section = _ProtectedSection
```
Може да изглежда дребнаво, но всъщност в контекста на голям проект, чиито код се чете и пише от множество хора - доста важно.
[PEP8 reference](https://peps.python.org/pep-0008/#class-names).  
[Something even better](https://www.youtube.com/watch?v=hgI0p1zf31k&ab_channel=PythonDiscord). | 
|   
        Марина Господинова
         09.11.2024 14:05Не знам дали мястото да попитам е тук, но понеже името на контекстния мениджър е ProtectedSection, при имената на кои видове обекти е позволено използването на camelCase/PascalCase (освен класовете) и къде да се придържаме към snake_case? | 
| f | 1 | class ProtectedSection: | f | 1 | class ProtectedSection: | 
| 2 | """Еxecute a (relatively) error-free block of code.""" | 2 | """Еxecute a (relatively) error-free block of code.""" | ||
| 3 | 3 | ||||
| 4 | def __init__(self, log=(), suppress=()): | 4 | def __init__(self, log=(), suppress=()): | ||
| 5 | self.log = log | 5 | self.log = log | ||
| 6 | self.suppress = suppress | 6 | self.suppress = suppress | ||
| 7 | self.exception = None | 7 | self.exception = None | ||
| 8 | 8 | ||||
| 9 | def __enter__(self): | 9 | def __enter__(self): | ||
| t | t | 10 | self.exception = None | ||
| 10 | return self | 11 | return self | ||
| 11 | 12 | ||||
| 12 | def __exit__(self, exc_type, exc_val, exc_tb): | 13 | def __exit__(self, exc_type, exc_val, exc_tb): | ||
| 13 | if exc_type: | 14 | if exc_type: | ||
| 14 | if exc_type in self.log: | 15 | if exc_type in self.log: | ||
| 15 | self.exception = exc_val | 16 | self.exception = exc_val | ||
| 16 | return True | 17 | return True | ||
| 17 | elif exc_type in self.suppress: | 18 | elif exc_type in self.suppress: | ||
| 18 | return True | 19 | return True | ||
| 19 | return False | 20 | return False | 
| Legends | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 
 | 
 | |||||||||