Python中用来替代if , elif ,else的装饰器 singledispatch

参考资料
    1-<流畅的python>  第7章 7.8.2  单分派泛函数(170页)
    2-https://www.icode9.com/content-1-231851.html


# 1-根据参数的类型
def demo_test(para):
    ret = html.escape(repr(para))
    return "<pre>{}</pre>".format(ret)


ret = demo_test("你好")
print(ret)
"""
    以上是一个生成简单标签的泛函数, 如果需求是:
        字符串生成p标签
        元组生成list标签
        数字生成...
    
    方法一:
           在上边的泛函数中做判断:
                if type(para) == int:
                        ....
                elif  type(para) == str:
                         ....
                elif
    方法二:
          
"""


from functools import singledispatch
from collections import abc
import html
import numbers

# 泛函数
@singledispatch
def htmlize(obj):
    content = html.escape(repr(obj))
    return "<pre>{}</pre>".format(content)

# 用来处理字符串的函数
@htmlize.register(str)
def _(text):
    content = html.escape(text).replace('\n', '<br>\n')
    return '<p>{0}</p>'.format(content)

# 用来处理数字的函数
@htmlize.register(numbers.Integral)
def _(n):
    return '<pre>{0} (0x{0:x})</pre>'.format(n)

# 用来处理元组的函数
@htmlize.register(tuple)
@htmlize.register(abc.MutableSequence)
def _(seq):
    inner = '<li>\n<li>'.join(htmlize(item) for item in seq)
    return '<ul>\n<li>' + inner + '</li>\n</ul>'


# ret = htmlize(("姓名", "年龄", "身高"))
ret = htmlize(123)
print(ret)


# 2-根据参数的值
# python内置的装饰器只能根据参数的类型进行判断,执行不同的方法
# 如何根据参数的值来实现类似的效果:?

class StateMachine(object):

    def dispatch(self, *args, **kwgs):
        getattr(self, 'do_{}'.format(self.state))(*args, **kwgs)

    def do_new(self):
        print('new')

    def do_archive(self):
        print('archive')


sm = StateMachine()
sm.state = 'new'
sm.dispatch()
sm.state = 'archive'
sm.dispatch()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值