-W 如何与 DeprecationWarning 和 PendingDeprecationWarning 交互?

How does -W interact with DeprecationWarning and PendingDeprecationWarning?

如何使用 DeprecationWarningPendingDeprecationWarning 通知 developers/tests(但不是最终用户)即将弃用以及 python foo.py -W 控件?

下面的代码片段是一个孤立的重现,它没有像我预期的那样工作,但我也不知道如何让 -W 工作。

test_deprecation.py

from warnings import warn

def warningfunction():
    warn("this is deprecated", DeprecationWarning, 2)

def pendingfunction():
    warn("pending", PendingDeprecationWarning, 2)

def test_warning():
    warningfunction()

def test_pending():
    pendingfunction()


if __name__ == '__main__':
    warningfunction()
    pendingfunction()

运行 与 pytest test_deprecation.py -vv 一样,这两个警告都符合预期。至少这个不错!

运行 as python test_deprecation.py,只得到第一个警告(因为它在 main 中)。这也是我所期望的!

运行 as python test_deprecation.py -Wa,仍然只得到第一个警告。这是我不期望的部分。 -Wa 不是应该打开所有警告吗?

运行 as python test_deprecation.py -Wi(忽略警告),仍然只得到第一个警告。也不负众望。 -Wi 不是应该忽略所有警告吗?

-Wdefault  # Warn once per call location
-Werror    # Convert to exceptions
-Walways   # Warn every time
-Wmodule   # Warn once per calling module
-Wonce     # Warn once per Python process
-Wignore   # Never warn 

The action names can be abbreviated as desired (e.g. -Wi, -Wd, -Wa, -We) and the interpreter will resolve them to the appropriate action name.

来自 https://docs.python.org/3/using/cmdline.html#cmdoption-w

(python3.8 顺便说一下)

echo $PYTHONWARNINGS为空

您将 -Wa-Wi 作为参数传递给脚本。您需要将它们放在脚本名称之前,以将它们视为解释器本身的选项。