読者です 読者をやめる 読者になる 読者になる

HTML タグ付き文字列を動的に生成する

python

呼称: HTML タグ付き文字列の生成
目的: HTML タグ付き文字列を取得する
特徴: if 文を使用せずに分岐制御を行う
用例: HTML タグ付き文字列を動的に生成する
備考: メンテナンス性は高い?低い?

HTML タグは、タグの特性の応じて属性が異なります。HTML タグを含む文字列を動的に生成する場合、うまく関数化できないかなと挑戦してみました。キーワード引数をディクショナリで扱う **kwargs (この用法の呼び方も分からない(> <))を用いてタグ毎に関数を作成して、それをラッパー関数で一元化する処理を作成してみました。可読性は落ちますが、eval してしまうというのも1つの方法で、個人的には好きです(^ ^;;
元々の目的は、メンテナンス性を高めることだったのですが、良くも悪くも受け取れそうな、やや煩雑な気がします。微妙に違う文字列を生成するような処理はどう実装すれば良いのかな。

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

def main():
    print get_html_tag('anchor')(
        url  = 'http://d.hatena.ne.jp/t2y-1979/',
        name = 'forest book')
    print get_html_tag_eval('anchor')(
        url  = 'http://d.hatena.ne.jp/t2y-1979/',
        name = 'forest book',
        attr = 'target="_blank"')
    print get_html_tag('input')(
        type = 'button',
        id   = 'id_btn',
        name = 'btn',
        attr = 'value="ぼたん" style="width:100px;"')

def get_html_tag(type, func={}):
    """HTML タグを返すラッパー関数"""
    func['anchor'] = get_html_tag_anchor
    func['input'] = get_html_tag_input
    return func[type]

def get_html_tag_eval(type):
    """HTML タグを返すラッパー関数(eval)"""
    return eval('get_html_tag_' + type)

def get_html_tag_input(**kwargs):
    """input タグを返す"""
    attr = kwargs.get('attr', '')
    return '<input type="' + kwargs['type'] + '" id="' + kwargs['id'] \
            + '" name="' + kwargs['name'] + '" ' + attr + '/>'

def get_html_tag_anchor(**kwargs):
    """anchor タグを返す"""
    attr = kwargs.get('attr', '')
    return '<a href="' + kwargs['url'] + '" ' \
            + attr + '>' + kwargs['name'] + '</a>'

if __name__ == '__main__':
    main()

実行結果。

$ python ope_html_tag.py 
<a href="http://d.hatena.ne.jp/t2y-1979/" >forest book</a>
<a href="http://d.hatena.ne.jp/t2y-1979/" target="_blank">forest book</a>
<input type="button" id="id_btn" name="btn" value="ぼたん" style="width:100px;"/>

リファレンス:
Python.use(better, by="K&R") # for novice《25》switch(3)脱・ハードコーディング★: ひよ子のきもち

広告を非表示にする