我有一个允许许多选项作为布尔值的函数,例如:
def my_func(req, option_a=False, option_b=True, option_c=True):
pass
我想确保为这些变量添加布尔值,所以我可以这样做一个简单的检查:
def my_func(req, option_a=False, option_b=True, option_c=True):
for param in [option_a, option_b, option_c]:
if not isinstance(param, bool):
raise ValueError(f'Unexpected value {param} for X. A boolean value is required')
显然,这并未提供有关哪个参数具有错误值的大量信息。因此,我想知道是否可以获取变量的名称,以便上面代码段中的X
被变量名替换。错误的示例是:
option_b的意外值香蕉。需要布尔值
这在Python中是否可行?
答案 0 :(得分:1)
一切皆有可能!
def my_func(req, option_a=False, option_b=True, option_c=True):
for param_name in ['option_a', 'option_b', 'option_c']:
param = locals()[param_name]
if not isinstance(param, bool):
raise ValueError(f'Unexpected value {param} for {param_name}. A boolean value is required')
另一种选择是使用一些**kwargs
并以某种方式解析它。或者可以输入注释和类型检查器。
答案 1 :(得分:1)
如果您接受在函数中使用**kwargs
而不是显式选项名称,则可以执行以下操作:
def my_func(req, **kwargs):
default_params = {"option_a":False, "option_b":True, "option_c":True}
for name,dpv in default_params.items():
if name in kwargs:
param = kwargs[name]
if not isinstance(param, type(dpv)):
raise ValueError('Unexpected value {param} for {name}. A {type} value is required'.format(param=param,name=name,type=dpv.__class__.__name__))
else:
kwargs[name] = dpv
print(kwargs)
my_func(12,option_a=False,option_b=False,option_c=True)
此代码具有参数&他们的默认值。如果类型与传递的参数之一不匹配,则会出现错误。
如果省略值,则会手动为kwargs
分配默认值。
这适用于布尔值,但也适用于其他类型(当然,因为布尔值是整数,它允许整数通过,除非您通过严格的isinstance
检查更改type(param) == type(dpv)
)