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
仙衣眠云碧岚袍,一襟潇洒,两袖飘飘。玉墨舒心春酝瓢,行也逍遥,坐也逍遥。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具