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
    
    仙衣眠云碧岚袍,一襟潇洒,两袖飘飘。玉墨舒心春酝瓢,行也逍遥,坐也逍遥。
  • 相关阅读:
    数据库三大范式
    sql 外键 on update cascade 和 on delete cascade 作用区别?
    Mybatis入门简版(二)
    Mybatis入门简版(一)
    Mybatis入门简版(补充)
    SQL中ON和WHERE的区别
    MySQL基础(五)常见运算符
    MySQL基础(四)常用函数
    MySQL基础(三)多表查询(各种join连接详解)
    MySQL基础(二)
  • 原文地址:https://www.cnblogs.com/max520liuhu/p/12046029.html
Copyright © 2011-2022 走看看