Command mode and iterator pattern | Python theme on 13/30

Writing in the front

This article is participating in Python Theme Month. See the link for details

This month is Python Activity month, and I decided to try out the daily and random questions in Python for 30 days. Then if I have the energy for the weekend, I’d like to play around with this Python-Patterns

Design mode for me is more learning than my personal experience summary, so I am likely to understand the partial, if there is a boss to see, please timely point out that I choose to write some personal things in Nuggets because of the higher quality of the article here, I do not hope that the later to see these articles are misleading.

Command mode


from typing import Union


class HideFileCommand:
    """ A command to hide a file given its name """

    def __init__(self) - >None:
        # an array of files hidden, to undo them as needed
        self._hidden_files = []

    def execute(self, filename: str) - >None:
        print(f"hiding {filename}")
        self._hidden_files.append(filename)

    def undo(self) - >None:
        filename = self._hidden_files.pop()
        print(f"un-hiding {filename}")


class DeleteFileCommand:
    """ A command to delete a file given its name """

    def __init__(self) - >None:
        # an array of deleted files, to undo them as needed
        self._deleted_files = []

    def execute(self, filename: str) - >None:
        print(f"deleting {filename}")
        self._deleted_files.append(filename)

    def undo(self) - >None:
        filename = self._deleted_files.pop()
        print(f"restoring {filename}")


class MenuItem:
    """ The invoker class. Here it is items in a menu. """

    def __init__(self, command: Union[HideFileCommand, DeleteFileCommand]) - >None:
        self._command = command

    def on_do_press(self, filename: str) - >None:
        self._command.execute(filename)

    def on_undo_press(self) - >None:
        self._command.undo()


def main() :
    """ >>> item1 = MenuItem(DeleteFileCommand()) >>> item2 = MenuItem(HideFileCommand()) # create a file named `test-file` to work with >>> test_file_name = 'test-file' # deleting `test-file` >>> item1.on_do_press(test_file_name) deleting test-file # restoring `test-file` >>> item1.on_undo_press() restoring test-file # hiding `test-file` >>> item2.on_do_press(test_file_name) hiding test-file # un-hiding `test-file` >>> item2.on_undo_press() un-hiding test-file "" "


if __name__ == "__main__":
    import doctest

    doctest.testmod()

Copy the code

Iterator pattern


def count_to(count) :
    """Counts by word numbers, up to a maximum of five"""
    numbers = ["one"."two"."three"."four"."five"]
    yield from numbers[:count]


# Test the generator
def count_to_two() - >None:
    return count_to(2)


def count_to_five() - >None:
    return count_to(5)


def main() :
    """ # Counting to two... >>> for number in count_to_two(): ... print(number) one two # Counting to five... >>> for number in count_to_five(): ... print(number) one two three four five """


if __name__ == "__main__":
    import doctest

    doctest.testmod()

Copy the code

summary

reference

  • There is no