From ade29d6e54b42de37d03d44daf5709782b8f99d9 Mon Sep 17 00:00:00 2001 From: Yeonggwang Date: Mon, 6 Dec 2021 10:30:26 +0900 Subject: [PATCH 1/4] Added type hints to chaining method pattern --- patterns/behavioral/chaining_method.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/patterns/behavioral/chaining_method.py b/patterns/behavioral/chaining_method.py index 1fd261a45..195bfa58f 100644 --- a/patterns/behavioral/chaining_method.py +++ b/patterns/behavioral/chaining_method.py @@ -1,22 +1,25 @@ +from __future__ import annotations + + class Person: - def __init__(self, name, action): + def __init__(self, name: str, action: Action) -> None: self.name = name self.action = action - def do_action(self): + def do_action(self) -> Action: print(self.name, self.action.name, end=" ") return self.action class Action: - def __init__(self, name): + def __init__(self, name: str) -> None: self.name = name - def amount(self, val): + def amount(self, val: str) -> Action: print(val, end=" ") return self - def stop(self): + def stop(self) -> None: print("then stop") From d752949b0efacaff1f300096f0dc4f71ae70a428 Mon Sep 17 00:00:00 2001 From: Yeonggwang Date: Mon, 6 Dec 2021 10:35:04 +0900 Subject: [PATCH 2/4] Added type hints to iterator pattern --- patterns/behavioral/iterator_alt.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/patterns/behavioral/iterator_alt.py b/patterns/behavioral/iterator_alt.py index 2e3a8ba34..d6fb0df9e 100644 --- a/patterns/behavioral/iterator_alt.py +++ b/patterns/behavioral/iterator_alt.py @@ -4,6 +4,7 @@ *TL;DR Traverses a container and accesses the container's elements. """ +from __future__ import annotations class NumberWords: @@ -17,14 +18,14 @@ class NumberWords: "five", ) - def __init__(self, start, stop): + def __init__(self, start: int, stop: int) -> None: self.start = start self.stop = stop - def __iter__(self): # this makes the class an Iterable + def __iter__(self) -> NumberWords: # this makes the class an Iterable return self - def __next__(self): # this makes the class an Iterator + def __next__(self) -> str: # this makes the class an Iterator if self.start > self.stop or self.start > len(self._WORD_MAP): raise StopIteration current = self.start From 0ef9e80c2b4dfa427b163cd2900ca95c689c8583 Mon Sep 17 00:00:00 2001 From: Yeonggwang Date: Mon, 6 Dec 2021 11:45:19 +0900 Subject: [PATCH 3/4] Change string literals to class name. [PEP-0563] --- patterns/creational/prototype.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/patterns/creational/prototype.py b/patterns/creational/prototype.py index 111d19ef5..906ed7ab8 100644 --- a/patterns/creational/prototype.py +++ b/patterns/creational/prototype.py @@ -20,6 +20,7 @@ *TL;DR Creates new object instances by cloning prototype. """ +from __future__ import annotations from typing import Any, Dict @@ -29,7 +30,7 @@ def __init__(self, value: str = "default", **attrs: Any) -> None: self.value = value self.__dict__.update(attrs) - def clone(self, **attrs: Any) -> "Prototype": + def clone(self, **attrs: Any) -> Prototype: """Clone a prototype and update inner attributes dictionary""" # Python in Practice, Mark Summerfield # copy.deepcopy can be used instead of next line. From d3d00e5809b9abd59bddcd898d28e4e0127c050b Mon Sep 17 00:00:00 2001 From: Yeonggwang Date: Wed, 8 Dec 2021 05:42:00 +0900 Subject: [PATCH 4/4] Solve linter error --- patterns/behavioral/observer.py | 6 +++--- patterns/behavioral/state.py | 2 +- patterns/behavioral/strategy.py | 4 ++-- patterns/creational/prototype.py | 4 ++-- patterns/fundamental/delegation_pattern.py | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/patterns/behavioral/observer.py b/patterns/behavioral/observer.py index b2d503b77..03d970ad6 100644 --- a/patterns/behavioral/observer.py +++ b/patterns/behavioral/observer.py @@ -12,7 +12,7 @@ from __future__ import annotations from contextlib import suppress -from typing import List, Optional, Protocol +from typing import Protocol # define a generic observer type @@ -23,7 +23,7 @@ def update(self, subject: Subject) -> None: class Subject: def __init__(self) -> None: - self._observers: List[Observer] = [] + self._observers: list[Observer] = [] def attach(self, observer: Observer) -> None: if observer not in self._observers: @@ -33,7 +33,7 @@ def detach(self, observer: Observer) -> None: with suppress(ValueError): self._observers.remove(observer) - def notify(self, modifier: Optional[Observer] = None) -> None: + def notify(self, modifier: Observer | None = None) -> None: for observer in self._observers: if modifier != observer: observer.update(self) diff --git a/patterns/behavioral/state.py b/patterns/behavioral/state.py index 3c606ca8e..423b749e5 100644 --- a/patterns/behavioral/state.py +++ b/patterns/behavioral/state.py @@ -18,7 +18,7 @@ def scan(self): self.pos += 1 if self.pos == len(self.stations): self.pos = 0 - print("Scanning... Station is {} {}".format(self.stations[self.pos], self.name)) + print(f"Scanning... Station is {self.stations[self.pos]} {self.name}") class AmState(State): diff --git a/patterns/behavioral/strategy.py b/patterns/behavioral/strategy.py index 595df255e..88862fa4c 100644 --- a/patterns/behavioral/strategy.py +++ b/patterns/behavioral/strategy.py @@ -10,7 +10,7 @@ from __future__ import annotations -from typing import Callable, Type +from typing import Callable class DiscountStrategyValidator: # Descriptor class for check perform @@ -36,7 +36,7 @@ def __set__(self, obj: Order, value: Callable = None) -> None: else: setattr(obj, self.private_name, None) - def __get__(self, obj: object, objtype: Type = None): + def __get__(self, obj: object, objtype: type = None): return getattr(obj, self.private_name) diff --git a/patterns/creational/prototype.py b/patterns/creational/prototype.py index 906ed7ab8..4151ffbf6 100644 --- a/patterns/creational/prototype.py +++ b/patterns/creational/prototype.py @@ -22,7 +22,7 @@ """ from __future__ import annotations -from typing import Any, Dict +from typing import Any class Prototype: @@ -43,7 +43,7 @@ class PrototypeDispatcher: def __init__(self): self._objects = {} - def get_objects(self) -> Dict[str, Prototype]: + def get_objects(self) -> dict[str, Prototype]: """Get all objects""" return self._objects diff --git a/patterns/fundamental/delegation_pattern.py b/patterns/fundamental/delegation_pattern.py index 2d2f85346..bdcefc9d0 100644 --- a/patterns/fundamental/delegation_pattern.py +++ b/patterns/fundamental/delegation_pattern.py @@ -8,7 +8,7 @@ from __future__ import annotations -from typing import Any, Callable, Union +from typing import Any, Callable class Delegator: @@ -31,7 +31,7 @@ class Delegator: def __init__(self, delegate: Delegate): self.delegate = delegate - def __getattr__(self, name: str) -> Union[Any, Callable]: + def __getattr__(self, name: str) -> Any | Callable: attr = getattr(self.delegate, name) if not callable(attr):