Python中如何避免调用其他函数时重复使用默认参数值?
复用Python函数默认参数的解决方案
先看场景:
有个带默认参数的函数:
def print_number(number=42): print(number)
现在要写另一个函数print_number_twice,调用它两次,同时允许用户传入参数。一开始可能会这么写:
def print_number_twice(number=42): print_number(number) print_number(number)
但这里硬写了默认值42,后续如果修改print_number的默认值(比如改成100),很容易漏改print_number_twice的默认值,导致两个函数的默认行为不一致,维护起来麻烦。
有人试过用None当默认值:
def print_number_twice(number=None): print_number(number) print_number(number)
但Python里None是合法参数,调用时会直接打印"None",达不到复用原函数默认值的效果。
下面给两种实用的解决办法:
方法1:主动获取原函数的默认参数
可以通过Python的inspect模块或者函数自带的__defaults__属性,拿到print_number的默认参数值,避免硬写:
用inspect模块(可读性更好)
import inspect def print_number(number=42): print(number) def print_number_twice(number=None): if number is None: # 获取print_number函数的参数签名 sig = inspect.signature(print_number) # 取出number参数的默认值 number = sig.parameters['number'].default print_number(number) print_number(number)
用__defaults__属性(更简洁)
每个函数的__defaults__属性会返回一个元组,里面是位置参数的默认值,按顺序排列:
def print_number(number=42): print(number) def print_number_twice(number=None): if number is None: # 第一个位置参数的默认值就是元组的第一个元素 number = print_number.__defaults__[0] print_number(number) print_number(number)
方法2:参数透传(最灵活)
如果不需要在print_number_twice里处理参数,直接用*args和**kwargs把参数原封不动传给print_number就行,不管原函数默认值怎么变,都能自动复用:
def print_number(number=42): print(number) def print_number_twice(*args, **kwargs): print_number(*args, **kwargs) print_number(*args, **kwargs)
这种方式还能兼容原函数后续的参数变更,比如以后给print_number加个新的默认参数prefix="Number: ",print_number_twice不用改一行代码就能支持传入这个参数,扩展性拉满。
内容的提问来源于stack exchange,提问作者Tomáš Zato
相关产品推荐
相关产品推荐

