在 python 中打印警告时如何引用正确的文件?

How to reference the correct file when printing a warning in python?

我刚开始使用 python 中的 warnings 模块。我试图了解如何在发出警告时引用给定文件中的正确行。

我正在编写一个模块,其中一些函数可以发出警告,但我希望所有警告都指向它们发出的行在导入模块的脚本中 ,而不是它们在模块本身中发布的行。我想我知道 warnings.warnstacklevel 参数是如何工作的,但我不知道如何将它与我的模块的函数一起使用,这些函数也在内部使用,因为它们的堆栈级别可能会有所不同。

我会尝试用一个例子来说明。假设我编写了以下模块,我称之为 testmodule.py.

import warnings

def f():
    warnings.warn('This is a test warning.', stacklevel=2)

def g():
    f()

然后我写了下面的脚本

import testmodule as test

test.f()
test.g()

如果我运行这个脚本,输出是

"script_filename":3: UserWarning: This is a test warning.
  test.f()
"module_filename":7: UserWarning: This is a test warning.
  f()

其中 "script_filename""module_filename" 是我在计算机上保存脚本和模块的文件的实际名称。

在上面的示例中,两个警告都正确地标识了调用 f 的行。但是,调用 test.g 时发出的警告指向 testmodule 内部,因此它对模块的用户没有用。有没有办法让这两个警告都指向它们在脚本中发出的那一行,而不是在模块本身?

通过这些小的更改,我得到了您所要求的确切行为。向 g() 添加参数可能不是您想要的,但我认为这是一个答案,可能有助于您理解。

import warnings

def f(slevel=2):
    warnings.warn('This is a test warning.', stacklevel=slevel)

def g(i):
    f(i)
import testmodule  as test

test.f()
test.g(3)

产出

script_filename:3: UserWarning: This is a test warning.
  test.f()
script_filename:4: UserWarning: This is a test warning.
  test.g(3)