关于python:获取迭代期间变量的名称

Get the name of the variable during iteration

我有一个函数允许许多选项作为布尔值,例如:

1
2
def my_func(req, option_a=False, option_b=True, option_c=True):
  pass

我想确保为这些变量添加了布尔值,因此我可以进行如下简单检查:

1
2
3
4
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。一个示例错误是:

Unexpected value bananas for option_b. A boolean value is required

这在Python中是可能的吗?


如果您接受在函数中使用**kwargs而不是显式选项名,则可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
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)


一切皆有可能!

1
2
3
4
5
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并以某种方式解析它。或者键入批注和类型检查器。