Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
568e0e1
Add .gitignore
May 25, 2022
2cdd4af
create Task1 module
Jul 6, 2022
3deb526
add a dockstring
Jul 6, 2022
d13b332
create MyOpen class
Jul 6, 2022
faa7c21
override __init__
Jul 6, 2022
ef32b64
override __enter__
Jul 6, 2022
de61ea2
override __exit__
Jul 6, 2022
c25e403
call the main program
Jul 6, 2022
12c3e8b
create _print_ex function
Jul 6, 2022
4bd4939
import sys
Jul 6, 2022
6a51731
import traceback
Jul 6, 2022
b0f2197
call _print_ex function
Jul 6, 2022
99eb262
add a dockstrint to the _print_ex function
Jul 6, 2022
0e14832
add a dockstrint to the MyOpen class
Jul 6, 2022
830e988
create Task2 module
Jul 6, 2022
3b4ca0c
create my_open function
Jul 6, 2022
5132409
call the main program
Jul 6, 2022
283977c
create _print_ex function
Jul 6, 2022
bc78409
import sys
Jul 6, 2022
e35ac44
import traceback
Jul 6, 2022
a31d147
add a dockstring to the my_open function
Jul 6, 2022
72596b8
create Task3 module
Jul 6, 2022
04064d9
create ExecutionTimeToLogFile class
Jul 6, 2022
4ea99dc
import ContextDecorator
Jul 6, 2022
7d23dd2
override __init__
Jul 6, 2022
a5d1aea
override __enter__
Jul 6, 2022
ffdbdf5
import time
Jul 6, 2022
8bf1357
override __exit__
Jul 6, 2022
d57894b
create fun function
Jul 6, 2022
3adbcde
import sleep
Jul 6, 2022
38500d9
add a decorator to the fun function
Jul 6, 2022
bbdaf92
call main function
Jul 6, 2022
1f8165c
add a docstring to the fun function
Jul 6, 2022
0041df4
add a docstring to the ExecutionTimeToLogFile class
Jul 6, 2022
9f1c344
crteate Task4 module
Jul 6, 2022
b567ede
create SupressDecorator class
Jul 6, 2022
0859cbd
override __init__
Jul 6, 2022
35e946c
override __enter__
Jul 6, 2022
4033f0e
import ContextDecorator
Jul 6, 2022
f9cc7ca
import sleep
Jul 6, 2022
b95219c
override __exit__
Jul 6, 2022
676cbd6
create fun function
Jul 6, 2022
4d06211
import sleep/
Jul 6, 2022
7c224b9
call main funcrion
Jul 6, 2022
10af066
add a dockstring to the SupressDecorator class
Jul 6, 2022
c5d4a58
move files to AndreyOzerets folder
Jul 6, 2022
21f4d34
create Task5 module
Jul 6, 2022
af74a3c
create MyBaseError class
Jul 6, 2022
7f12af9
override __init__
Jul 6, 2022
8ccfd8a
override __str__
Jul 6, 2022
c454ac5
add a dockstring to the MyBaseError
Jul 6, 2022
ae04f6f
create WrongTypeError
Jul 6, 2022
5e4e8cb
create NegativeError
Jul 6, 2022
13ae079
create check_parity function
Jul 6, 2022
71e7173
call main function
Jul 6, 2022
0dc0a38
create Task7 module
Jul 6, 2022
cbb2da9
create typed_prop function
Jul 6, 2022
a35128d
create MyNumberCollection class
Jul 6, 2022
e51b5da
import Iterable
Jul 6, 2022
51d798e
create _init_collection method
Jul 6, 2022
e8b3ec2
create _add_el method
Jul 6, 2022
70622c8
create _validate method
Jul 6, 2022
f86c290
create append method
Jul 6, 2022
4840de6
overrite __str__
Jul 6, 2022
2f8240e
overrite __getitem__
Jul 6, 2022
6dc8d77
overrite __add__
Jul 6, 2022
683437d
overrite __iter__
Jul 6, 2022
633a796
call main function
Jul 6, 2022
47d687c
del Iterable from step variable
Jul 6, 2022
fcd15a6
del Iterable from stop variable
Jul 6, 2022
f4ba36f
fix col1 object
Jul 6, 2022
6ddcc04
create Task8 module
Jul 6, 2022
12bb3d7
create MySquareIterator class
Jul 6, 2022
594b31b
override __init__
Jul 6, 2022
be5443d
import deepcopy
Jul 6, 2022
c1e98a9
override __iter__
Jul 6, 2022
3af6cc8
override __next__
Jul 6, 2022
7528f79
create main function
Jul 6, 2022
c744c85
call main function
Jul 6, 2022
7f3c74c
create Task9 module
Jul 6, 2022
a0a2ed5
cerate typed_prop function
Jul 6, 2022
7365982
create EvenRange class
Jul 6, 2022
c5f4955
override __init__
Jul 6, 2022
9e914b9
override __iter__
Jul 6, 2022
9b16ba8
override __next__
Jul 6, 2022
5237664
create main function
Jul 6, 2022
ce7965f
call main function
Jul 6, 2022
22917f2
create Task10 module
Jul 6, 2022
7aa6200
create endless_generator function
Jul 6, 2022
af8bf3e
create main function
Jul 6, 2022
e7d679c
import sleep
Jul 6, 2022
7312297
call main function
Jul 6, 2022
7d605a2
create Task11 module
Jul 6, 2022
de78d78
create endless_fib_generator function
Jul 6, 2022
847ec55
import Generator
Jul 6, 2022
09efd4c
create main function
Jul 6, 2022
8200e01
import sleep
Jul 6, 2022
24989db
call main function
Jul 6, 2022
d808312
del number
Jul 6, 2022
534954d
Merge branch 'session_7' of https://github.com/iteegi/Homework into s…
Jul 7, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.vscode
39 changes: 39 additions & 0 deletions AndreyOzerets/Task1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Task 7.1
import sys
import traceback


class MyOpen:
"""Context manager for opening and working with file"""

def __init__(self, file, mode='r') -> None:
self._file = file
self._mode = mode
self._file_obj = None

def __enter__(self):
self._file_obj = open(self._file, self._mode)
return self._file_obj

def __exit__(self, exc_type, exc_val, exc_tb):
self._file_obj.close()


def _print_ex():
"""Print traceback"""
*_, exc_traceback = sys.exc_info()
traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)


if __name__ == '__main__':
try:
with MyOpen('d.txt', 'r') as mo:
mo.write('OK')
except FileNotFoundError as e:
_print_ex()
print(f'\n*** Is the filename correct?: {e}', end='\n\n')
raise SystemExit
except ValueError as e:
_print_ex()
print(f'\n*** Is the mode correct?: {e}', end='\n\n')
raise SystemExit
23 changes: 23 additions & 0 deletions AndreyOzerets/Task10.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Task 7.10

from time import sleep


def endless_generator():
"""Endless generator."""
number = 1
while True:
yield number
number += 2


def main():
"""Main function."""
gen = endless_generator()
while True:
print(next(gen))
sleep(.3)


if __name__ == '__main__':
main()
29 changes: 29 additions & 0 deletions AndreyOzerets/Task11.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Task 7.11


from typing import Generator
from time import sleep


def endless_fib_generator() -> Generator[int, None, None]:
"""Infinite fibonacci numbers.

:yield: Fibonacci number at each iteration.
:rtype: Generator[int, None, None]
"""

first, second = 0, 1
while True:
yield second
first, second = second, first + second


def main():
gen = endless_fib_generator()
while True:
print(next(gen))
sleep(.3)


if __name__ == '__main__':
main()
36 changes: 36 additions & 0 deletions AndreyOzerets/Task2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Task 7.2
from contextlib import contextmanager
import sys
import traceback


@contextmanager
def my_open(file, mode='r'):
"""Context manager for opening and working with file"""

f = open(file, mode)
try:
yield f
finally:
f.close()


def _print_ex():
"""Print traceback"""
*_, exc_traceback = sys.exc_info()
traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)


if __name__ == '__main__':

try:
with my_open('a.txt', 'w') as mo:
mo.write('OK')
except FileNotFoundError as e:
_print_ex()
print(f'\n*** Is the filename correct?: {e}', end='\n\n')
raise SystemExit
except ValueError as e:
_print_ex()
print(f'\n*** Is the mode correct?: {e}', end='\n\n')
raise SystemExit
37 changes: 37 additions & 0 deletions AndreyOzerets/Task3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Task 7.3
from contextlib import ContextDecorator
from time import sleep, time


class ExecutionTimeToLogFile(ContextDecorator):
"""Decorator with context manager

Support for writing execution time to log-file.
"""

def __init__(self, file) -> None:
super().__init__()
self._file = file

def __enter__(self):
print('Starting')
self._start = time()
return self

def __exit__(self, *exc):
_stop = str(time() - self._start)
with open(self._file, 'w') as f:
f.write(f'Execution time is {_stop}')
print('Finishing')


@ExecutionTimeToLogFile('log-file.txt')
def fun():
"""Something very important"""

for _ in range(50):
sleep(0.01)


if __name__ == '__main__':
fun()
45 changes: 45 additions & 0 deletions AndreyOzerets/Task4.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Task 7.4

from contextlib import ContextDecorator
from time import sleep, time


class SupressDecorator(ContextDecorator):
"""Decorator for supressing exceptions"""

def __init__(self, file) -> None:
super().__init__()
self._file = file

def __enter__(self):
print('Starting')
self._start = time()
return self

def __exit__(self, exc_type, exc_val, exc_tb):
_stop = str(time() - self._start)
message = f'Execution time is {_stop}'
if exc_type:
with open(self._file, 'w') as f:
f.write(message)
else:
print(message)

print('Finishing')
return True


@SupressDecorator('log-file.txt')
def fun():
"""Something very important"""

for _ in range(50):
sleep(0.01)


if __name__ == '__main__':

with SupressDecorator('log-file.txt'):
for _ in range(50):
sleep(0.01)
raise Exception('---')
54 changes: 54 additions & 0 deletions AndreyOzerets/Task5.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Task 7.5


class MyBaseError(Exception):
"""Base class for native error"""

def __init__(self, number, message):
super().__init__(number, message)
self._number = number
self._message = message

def __str__(self):
return f'{self._number} - {self._message}'


class WrongTypeError(MyBaseError):
"""Class for type errors"""

def __init__(self, number, message='is not a number') -> None:
super().__init__(number, message)


class NegativeError(MyBaseError):
"""Class of positive errors"""

def __init__(self, number, message='must be positive'):
super().__init__(number, message)


def check_parity(number: int) -> bool:

if not isinstance(number, int):
raise WrongTypeError(number)

if number is False:
raise MyBaseError(number, 'cannot be False')

if number < 0:
raise NegativeError(number)

return number % 2 == 0


if __name__ == '__main__':
try:
print(check_parity(-9))
except WrongTypeError as e:
print(e)
except MyBaseError as e:
print(e)
except NegativeError as e:
print(e)
else:
print('OK')
108 changes: 108 additions & 0 deletions AndreyOzerets/Task7.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Task 7.7

from collections.abc import Iterable
from typing import List


def typed_prop(name, expectrd_type):
"""Type checking"""

storage_name = '_' + name

@property
def prop(self):
return getattr(self, storage_name)

@prop.setter
def prop(self, value):
if isinstance(value, expectrd_type) and \
self._validate(value, f'{self.__class__.__name__} supports only numbers!'):
setattr(self, storage_name, value)
else:
raise TypeError(
f'{self.__class__.__name__} supports only numbers!')

return prop


class MyNumberCollection:
start = typed_prop('start', (int, Iterable))
stop = typed_prop('stop', (int, type(None)))
step = typed_prop('step', (int, type(None)))

def __init__(self, start, stop=None, step=None) -> None:
self.start = start
self.stop = stop
self.step = step
self._collection: List[int] = []
self._init_collection()

def append(self, value):
"""Add item to the collection."""
if self._validate(value, f"'string' - object is not a number!"):
self._add_el(value)

def _init_collection(self) -> None:
"""Complete the original list."""
if isinstance(self.start, Iterable):
self._add_el(self.start)
else:
self._collection = [i for i in range(self.start, self.stop,
self.step)
] + [self.stop]

def _add_el(self, value) -> None:
"""Add items to the list."""

if isinstance(value, Iterable):
for i in value:
if isinstance(i, Iterable):
self._add_el(i)
else:
self._collection.append(i)
else:
self._collection.append(value)

def _validate(self, value, message) -> bool:
"""Check if the passed value is not a string."""
if isinstance(value, Iterable):
for i in value:
if isinstance(i, Iterable) and not isinstance(i, str):
self._validate(i, message)
if isinstance(i, (str)):
raise TypeError(message)
return True

def __str__(self) -> str:
return f'{self._collection}'

def __getitem__(self, item):
return self._collection[item] ** 2

def __add__(self, other):
return self._collection + other._collection

def __iter__(self):
for i in self._collection:
yield i


if __name__ == '__main__':
# col3 = MyNumberCollection((1, (7, 9, (0, 's')), 3, 4))
col1 = MyNumberCollection(0, 5, 2)
col2 = MyNumberCollection((1, 2, 3, 4, 5))
# col3 = MyNumberCollection((1,2,3,"4",5))

print(f'collection 1 = {col1}')
print(f'collection 2 = {col2}')
# print(f'collection 3 = {col3}')
col1.append(7)
print(f'collection 1 = {col1}')
# col2.append("string")
print(col1 + col2)
print(f'collection 1 = {col1}')
print(f'collection 2 = {col2}')
print(col2[4])

for item in col1:
print(item)
Loading