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

时间:2018-02-23 09:54:33

标签: python variables string-interpolation

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

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中是否可行?

2 个答案:

答案 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)