在迭代期间获取变量的名称
Get the name of the variable during iteration
我有一个函数允许许多选项作为布尔值,例如:
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')
显然,这并没有提供很多关于哪个参数的值有误的信息。因此,我想知道是否可以获取变量的 name,以便将上述代码段中的 X
替换为变量名称。错误示例为:
Unexpected value bananas for option_b. A boolean value is required
这在 Python 中可行吗?
一切皆有可能!
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
并以某种方式解析它。或者可能是类型注释加上类型检查器。
如果您同意在您的函数中使用 **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
将被手动分配一个默认值。
这适用于布尔值,但也适用于其他类型(当然,由于布尔值是整数,它允许整数通过,除非您通过严格的 type(param) == type(dpv)
检查更改 isinstance
)
我有一个函数允许许多选项作为布尔值,例如:
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')
显然,这并没有提供很多关于哪个参数的值有误的信息。因此,我想知道是否可以获取变量的 name,以便将上述代码段中的 X
替换为变量名称。错误示例为:
Unexpected value bananas for option_b. A boolean value is required
这在 Python 中可行吗?
一切皆有可能!
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
并以某种方式解析它。或者可能是类型注释加上类型检查器。
如果您同意在您的函数中使用 **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
将被手动分配一个默认值。
这适用于布尔值,但也适用于其他类型(当然,由于布尔值是整数,它允许整数通过,除非您通过严格的 type(param) == type(dpv)
检查更改 isinstance
)