zoukankan      html  css  js  c++  java
  • effective python 读书笔记:第21条-用只能以关键字形式指定的参数来确保代码明晰

    第21条-用只能以关键字形式指定的参数来确保代码明晰

    关键字参数可以通过位置参数传参

    问题: 1 函数是如何接受参数的 ?

    def safe_division(
            number, divisor,
            ignore_overflow=False,
            ignore_zero_division=False):
    
        try:
            print('no error')
            return number / divisor
        except OverflowError:
            print('ignore_overflow is {}'.format(ignore_overflow))
            if ignore_overflow:
                return 0
            else:
                print('OverflowError')
                # raise
        except ZeroDivisionError:
            print('ignore_zero_division is {}'.format(ignore_zero_division))
            if ignore_zero_division:
                return float('inf')
            else:
                print('ZeroDivisionError')
                # raise
    
    
    # pass
    print(safe_division(1, 10 ** 500, False, False))
    print('==========')
    print(safe_division(1, 10 ** 500, True, False))
    print('==========')
    print(safe_division(1, 0, True, True))
    print('==========')
    print(safe_division(1, 0, True, False))
    print('==========')
    # no error
    # 0.0
    # ==========
    # no error
    # 0.0
    # ==========
    # no error
    # ignore_zero_division is True
    # inf
    # ==========
    # no error
    # ignore_zero_division is False
    # ZeroDivisionError
    # None
    # ==========
    # no error
    # ignore_zero_division is True
    # inf
    

    以上写法存在的弊端为:函数定义了关键字参数,但是均可以通过位置参数与关键子参数传参,而位置参数容易导致传参错误

    改进方向:必须以关键字的方式传参

    #PYHTON2
    
    def safe_division(number, divisor, **kwargs):
        ignore_overflow = kwargs.pop('ignore_overflow', False)
        ignore_zero_div = kwargs.pop('ignore_zero_division', False)
        if kwargs:
            raise TypeError('Unexpected **kwargs: %r' % kwargs)
        try:
            return number / divisor
        except OverflowError:
            if ignore_overflow:
                return 0
            else:
                return 'OverflowError'
                # raise
        except ZeroDivisionError:
            if ignore_zero_div:
                return float('inf')
            else:
                return 'ZeroDivisionError'
                # raise
    
    
    print(safe_division(1, 0, ignore_overflow=True, ignore_zero_division=True))
    # inf
    print(safe_division(1, 10 ** 500, True, False))
    # TypeError: safe_division() takes 2 positional arguments but 4 were given
    
    
    
    #PYTHON3
    # 星号 位置参数的结束标志
    def safe_division(
            number, divisor, *,
            ignore_overflow=False,
            ignore_zero_division=False):
        try:
            return number / divisor
        except OverflowError:
            if ignore_overflow:
                return 0
            else:
                return 'OverflowError'
                # raise
        except ZeroDivisionError:
            if ignore_zero_division:
                return float('inf')
            else:
                return 'ZeroDivisionError'
                # raise
    
    
    print(safe_division(1, 0, ignore_overflow=True, ignore_zero_division=True))
    # output:
    # inf
    
    
    print(safe_division(1, 10 ** 500, True, False))
    # output
    # TypeError: safe_division() takes 2 positional arguments but 4 were given
    
    仙衣眠云碧岚袍,一襟潇洒,两袖飘飘。玉墨舒心春酝瓢,行也逍遥,坐也逍遥。
  • 相关阅读:
    HDU 2149 Public Sale 博弈
    HDU 1850 Being a Good Boy in Spring Festival 博弈
    HDU 2176 取(m堆)石子游戏 博弈
    HDU 1517 A Multiplication Game 博弈
    HDU 2897 邂逅明下 博弈
    51nod 1445 变色DNA 最短路
    cocos creator中粒子效果的使用
    如何在cocos中为节点添加监听事件
    C++中STL常用容器的优点和缺点
    数据库链接池c3p0的配置
  • 原文地址:https://www.cnblogs.com/max520liuhu/p/12046029.html
Copyright © 2011-2022 走看看