Python Design Pattern - Méthode de modèle

De Python en pratique: créer de meilleurs programmes à l'aide de la concurrence

#!/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 - Méthode de modèle
Design Pattern #Template, méthode
Apprenez le modèle de conception "Méthode de modèle" en Python
Design Pattern #Factory, méthode
[Explication détaillée] Modèle de méthode de modèle
Apprenez le modèle de conception "Méthode d'usine" en Python
[Gang of Four] Apprentissage des modèles de conception - Méthode du modèle
Modèle de méthode de modèle en Java
Apprenez le modèle de conception "Prototype" avec Python
Apprenez le modèle de conception "Builder" avec Python
Modèle de conception #Builder
Modèle de conception #Adapter
Apprenez le modèle de conception "Flyweight" en Python
Apprenez le modèle de conception "Observer" en Python
Apprenez le modèle de conception "Memento" avec Python
Apprenez le modèle de conception "Proxy" en Python
Modèle de conception #Decorator
Apprenez le modèle de conception "Commande" en Python
Apprenez le modèle de conception "Visiteur" avec Python
Apprenez le modèle de conception "Bridge" avec Python
Apprenez le modèle de conception "Décorateur" avec Python
Modèle de conception #Facade
Apprenez le modèle de conception "Iterator" avec Python
Modèle de conception #Strategy
Apprenez le modèle de conception «Stratégie» avec Python
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "Singleton" avec Python
Modèle de conception #Proxy
Apprenez le modèle de conception "État" en Python
Apprenez le modèle de conception "Adapter" avec Python
Méthode Johnson (python)
Apprenez le modèle de conception "Façade" avec Python
[Python] Modèle Tkinter
Motif singleton en Python
Modèle de visiteur en Python
Méthode d'installation Python Windows
Modèle Pro compétitif (Python)
Méthode Simplex (méthode unique) en Python
Méthode privée en python
Modèle d'analyse de données Python
Moteur de template Jinja2 2 Python
modèle de test unitaire python
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
J'ai écrit un modèle de conception dans l'édition de modèle kotlin
[Python] Méthode de calcul avec numpy
Modèle Python pour Codeforces-test manuel-
Modèle de conception Oreore: variable glocale
[Python] Modèle Pro compétitif [Chez Coder]
Suppression des substitutions de méthode en Python
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de méthode de modèle
Implémenter le modèle Singleton en Python
Introduction d'une méthode de conception de contrôleur pilotée par les données
Implémentation de la méthode de propagation d'étiquettes en Python
Simuler la méthode Monte Carlo en Python
Modèle de prétraitement pour l'analyse des données (Python)
Méthode Hash (méthode d'adresse ouverte) en Python