访问 variable/argument 的名称

Accessing the name of a variable/argument

我正在 Python 中编写一个函数来计算一些东西,如果我的函数的参数类型不正确,它就会失败。所以我想在发生这种情况时提出错误。

def do_stuff(x):
    if not isinstance(x, int):
        raise ValueError(f'Argument {x} is not int')
    pass

但是,打印的是x的内容,而不是x的名字,这对调试很有用。在实际情况下,x 需要是 pandas.Series 但有时会应用于 pandas.DataFrame。打印 DataFrame 的内容对于错误跟踪完全没有用。

我正在做更像这样的事情,并使用行号跟踪错误。但是有变量名会很棒

raise ValueError('Argument to do_stuff(x) is not int')

如果它太难看或令人费解(比如遍历所有变量并比较类型和值以获得匹配的名称),那么我会放弃。

谢谢

P.S.: 我使用的是 Python 3.9,所以 f-string 语法是有效的。不确定我是否可以使用其他最新版本的魔法。

对象在 Python 中没有专用名称。事实上,它们可以被多个名称引用。在您的示例中,您可以做的最好的事情是报告函数的参数名称,因为它至少在函数范围内是唯一的。如果你不想打印对象的值,你可以只打印它的类型,看起来这才是你真正想要捕捉的:

def do_stuff(x):
    if not isinstance(x, int):
        raise TypeError(f'Argument x of dostuff(x) is a {type(x)}, should be a {int}')
    pass

PS __name__ 属性用于存储 类 和函数的定义名称,但变量可能并不总是存在 (x = do_stuff; del do_stuff; print(x.__name__))。