在 python 中打印警告时如何引用正确的文件?
How to reference the correct file when printing a warning in python?
我刚开始使用 python 中的 warnings
模块。我试图了解如何在发出警告时引用给定文件中的正确行。
我正在编写一个模块,其中一些函数可以发出警告,但我希望所有警告都指向它们发出的行在导入模块的脚本中 ,而不是它们在模块本身中发布的行。我想我知道 warnings.warn
的 stacklevel
参数是如何工作的,但我不知道如何将它与我的模块的函数一起使用,这些函数也在内部使用,因为它们的堆栈级别可能会有所不同。
我会尝试用一个例子来说明。假设我编写了以下模块,我称之为 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)
我刚开始使用 python 中的 warnings
模块。我试图了解如何在发出警告时引用给定文件中的正确行。
我正在编写一个模块,其中一些函数可以发出警告,但我希望所有警告都指向它们发出的行在导入模块的脚本中 ,而不是它们在模块本身中发布的行。我想我知道 warnings.warn
的 stacklevel
参数是如何工作的,但我不知道如何将它与我的模块的函数一起使用,这些函数也在内部使用,因为它们的堆栈级别可能会有所不同。
我会尝试用一个例子来说明。假设我编写了以下模块,我称之为 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)