如何获取Python中未知类实例化所需的预期参数数量?
如何获取Python中未知类实例化所需的预期参数数量?
当然可以实现啦!在Python里我们有专门的工具来搞定这个需求——inspect模块,它就是用来检查代码对象细节的好帮手,用它能轻松拿到类实例化时需要的参数信息。
我给你写个实用的函数,你可以直接用,还能根据自己的需求调整:
首先导入inspect模块,然后定义计算参数的函数:
import inspect def nb_args(a_type): # 先拿到类的__init__方法的签名 sig = inspect.signature(a_type.__init__) # 提取所有参数,排除第一个默认的self参数 params = list(sig.parameters.values())[1:] if sig.parameters else [] # 这里分两种情况,你可以按需选择: # 1. 如果你想算**必填参数的数量**(没有默认值的参数) required_count = sum(1 for param in params if param.default is inspect.Parameter.empty) return required_count # 2. 如果你想算**所有参数的数量**(包括带默认值的可选参数) # return len(params)
咱们来测试几个例子看看效果:
# 无参数的类 class NoArgClass: pass # 两个必填参数的类 class TwoRequiredClass: def __init__(self, x, y): pass # 一个必填一个可选的类 class WithDefaultClass: def __init__(self, x, y=10): pass # 带可变参数的类 class VarArgClass: def __init__(self, x, *args): pass print(nb_args(NoArgClass)) # 输出0,符合预期 print(nb_args(TwoRequiredClass)) # 输出2 print(nb_args(WithDefaultClass)) # 输出1 print(nb_args(VarArgClass)) # 输出1(必填参数是x,*args是可变参数不占必填数)
这里要额外提一下:有些类没显式写__init__方法,这时候它会继承object的__init__,而object.__init__除了self没有其他参数,所以函数会返回0,完全符合我们的需求。
如果你的场景里需要处理可变参数(比如*args或**kwargs),还可以在函数里加判断,比如检查参数的kind属性:如果有VAR_POSITIONAL类型的参数,就说明可以接受任意多的位置参数;有VAR_KEYWORD类型的,就说明可以接受任意多的关键字参数。
备注:内容来源于stack exchange,提问作者Maxi mini
相关产品推荐
相关产品推荐

