在迭代期间获取变量的名称

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