Python Design Pattern - Template-Methode

Aus Python in der Praxis: Bessere Programme mit Parallelität erstellen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# http://www.amazon.co.jp/gp/product/B00EO3TRL2
# Python in Practice: Create Better Programs Using Concurrency, Libraries, and Patterns (Developer's Library) 

import abc
import re
import HTMLParser


class AbstractWordCounter(object):
    __metaclass__ = abc.ABCMeta

    @staticmethod
    @abc.abstractmethod
    def can_count(filename):
        pass

    @staticmethod
    @abc.abstractmethod
    def count(filename):
        pass


class PlainTextWordCounter(AbstractWordCounter):
    @staticmethod
    def count(filename):
        if not PlainTextWordCounter.can_count(filename):
            return 0
        regex = re.compile(r"\w+")
        total = 0
        with open(filename) as readfile:
            for line in readfile:
                for _ in regex.finditer(line):
                    total += 1
        return total


    @staticmethod
    def can_count(filename):
        return filename.lower().endswith((".py", ".txt"))


class HtmlWordCounter(AbstractWordCounter):
    @staticmethod
    def count(filename):
        if not HtmlWordCounter.can_count(filename):
            return 0
        parser = MyHTMLParser()
        with open(filename) as readfile:
            parser.feed(readfile.read())
        return parser.count


    @staticmethod
    def can_count(filename):
        return filename.lower().endswith((".html", ".htm"))


class MyHTMLParser(HTMLParser.HTMLParser):
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)
        self.regex = re.compile(r"\w+")
        self.inText = True
        self.text = []
        self.count = 0

    def handle_starttag(self, tag, attrs):
        if tag in {"script", "style"}:
            self.inText = False

    def handle_endtag(self, tag):
        if tag in {"script", "style"}:
            self.inText = True
        else:
            for _ in self.regex.findall(" ".join(self.text)):
                self.count += 1
            self.text = []

    def handle_data(self, text):
        if self.inText:
            text = text.rstrip()
            if text:
                self.text.append(text)


def count_word(filename):
    for wordCounter in (PlainTextWordCounter, HtmlWordCounter):
        if wordCounter.can_count(filename):
            return wordCounter.count(filename)


c = count_word("/tmp/sample.txt")
print "c=" + str(c) + "\n"

h = count_word("/tmp/sample.html")
print "h=" + str(h) + "\n"

Recommended Posts

Python Design Pattern - Template-Methode
Entwurfsmuster # Template-Methode
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
Entwurfsmuster #Factory-Methode
[Detaillierte Erklärung] Muster der Vorlagenmethode
Lernen Sie das Entwurfsmuster "Factory Method" in Python
[Viererbande] Design Pattern Learning - Template-Methode
Muster der Vorlagenmethode in Java
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Entwurfsmuster "Builder" mit Python
Entwurfsmuster #Builder
Entwurfsmuster #Adapter
Lernen Sie das Designmuster "Flyweight" in Python
Lernen Sie das Entwurfsmuster "Observer" in Python
Lernen Sie das Entwurfsmuster "Memento" mit Python
Lernen Sie das Entwurfsmuster "Proxy" in Python
Entwurfsmuster #Decorator
Lernen Sie das Entwurfsmuster "Befehl" in Python
Lernen Sie das Entwurfsmuster "Besucher" mit Python
Lernen Sie das Entwurfsmuster "Bridge" mit Python
Lernen Sie das Designmuster "Decorator" mit Python
Entwurfsmuster #Facade
Lernen Sie das Entwurfsmuster "Iterator" mit Python
Entwurfsmuster #Strategie
Lernen Sie das Entwurfsmuster "Strategie" mit Python
Lernen Sie das Entwurfsmuster "Composite" mit Python
Lernen Sie das Entwurfsmuster "Singleton" mit Python
Entwurfsmuster #Proxy
Lernen Sie das Entwurfsmuster "State" in Python
Lernen Sie das Entwurfsmuster "Adapter" mit Python
Johnson-Methode (Python)
Lernen Sie das Designmuster "Facade" mit Python
[Python] Tkinter-Vorlage
Singleton-Muster in Python
Besuchermuster in Python
Python-Installationsmethode Windows
Wettbewerbsfähige Pro-Vorlage (Python)
Simplex-Methode (Einzelmethode) in Python
Private Methode in Python
Python-Datenanalysevorlage
Jinja2 | Python-Vorlagen-Engine
Python-Unit-Test-Vorlage
Python Template Engine Empy
Lernen Sie das Entwurfsmuster "Chain of Responsibility" in Python
Ich habe ein Designmuster in der Kotlin Template Edition geschrieben
[Python] Berechnungsmethode mit numpy
Python-Vorlage für Codeforces-manuelle Test-
Oreore-Entwurfsmuster: Glokale Variable
[Python] Competitive Pro-Vorlage [At Coder]
Das Unterdrücken von Methodenüberschreibungen in Python
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Muster der Vorlagenmethode
Implementieren Sie das Singleton-Muster in Python
Einführung einer datengesteuerten Controller-Entwurfsmethode
Implementierte Methode zur Weitergabe von Etiketten in Python
Simulieren Sie die Monte-Carlo-Methode in Python
Vorverarbeitungsvorlage für die Datenanalyse (Python)
Hash-Methode (Open-Address-Methode) in Python