如何正确导入并循环遍历导入的变量

2024-06-16 10:44:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想换掉这个丑陋的街区:

import signal
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGQUIT, signal_handler)
signal.signal(signal.SIGILL, signal_handler)
signal.signal(signal.SIGPIPE, signal_handler)

有了这个:

^{pr2}$

不幸的是,python抛出:

File "./mysuperfile.py", line 107, in <module>
   for sig in (SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE):
       NameError: name 'SIGINT' is not defined

我也试过

from signal import signal, SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE

。。但这引发了:

  File "./mysuperfile.py", line 108, in <module>
    signal.signal(sig, signal_handler)
AttributeError: 'builtin_function_or_method' object has no attribute 'signal'

问题:正确的语法是什么?在

谢谢你!在


Tags: inpyimportsignallinefilehandlermodule
2条回答

您不能从自身导入信号,但可以分别导入两者。在

import signal
from signal import SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE

我可能会:

import signal
for sig in ("SIGINT", "SIGTERM", "SIGQUIT", "SIGILL", "SIGPIPE"):
    sig = getattr(signal,sig)
    signal.signal(sig, signal_handler)

当您做一个简单的import signal时,所有的信号句柄都可以在当前名称空间中找到signal.SIGNALNAME(例如signal.SIGQUIT)。这和:

^{pr2}$

当然,您可以在尝试以下操作时将它们直接导入当前命名空间:

^{3}$

但是signal函数在当前名称空间中被称为简单的signal(而不是signal.signal)。因此,使用该导入,可以执行以下操作:

for sig in (SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGPIPE):
    signal(sig, signal_handler)

然而,我发现这一点不太清楚。signal是模块还是函数?也许这并不难理解(毕竟,你不能调用一个模块),但另一种方式很明显。在

相关问题 更多 >