日志允许在函数定义之外吗?
问题是,是否可以导入执行日志功能定义之外的模块,如下例所示:
# directly imported code (not within a function)
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.info('Yay!')
需要一些背景来理解我对上述代码的担忧。 我有一个简单的Module.py
模块,用于测试import
是否能够在模块不存在时抛出异常。
# Module.py
import threading
import logging
import sys
class Thread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global import_is_working
try:
sys.stderr.write("Yes, it got into the 'try' blockn")
import NON_EXISTENT_MODULE
assert False
except:
sys.stderr.write("Great, your python language is workingn")
import_is_working = True
Thread().start()
# The following statements will block if "example.log" is a FIFO.
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.info('Yay!')
有时我喜欢从另一个模块import
上述代码:
# Main.py
import Module
起初,这两个模块似乎都起作用:
max% python Module.py
Yes, it got into the 'try' block
Great, your python language is working
max% python Main.py
Yes, it got into the 'try' block
Great, your python language is working
max%
但有时我想登录到管道,这可能会阻塞。 令人惊讶的是,这使得两个版本的行为有所不同:
max% rm example.log
max% mkfifo example.log
max% python Module.py
Yes, it got into the 'try' block
Great, your python language is working
^C
max% python Main.py
Yes, it got into the 'try' block
^C
所以我研究了一下,在别人的帮助下,在Python文档中找到以下字符串:
...导入不应该产生一个新线程,然后以任何方式等待该线程的副作用。
这些词,正如我在上面展示的那样,似乎定义了一个限制,它解释了上述程序中的问题。
问题是,上面的字符串实际上并不是我们在Python文档中找到这些单词的整个句子 。 事实上,整个句子是:
除了在主程序中,导入不应具有产生新线程的副作用,然后以任何方式等待该线程。
上面的例子从来没有在主程序Main.py
导入产卵/等待代码。 因此,限制根本不适用!
很明显,该文件并没有提供我们需要的所有信息来决定什么是安全的。 所以这让我想知道文件是多么不完整。 毕竟,说(强调我的)
除了在主程序中,导入不应具有产生新线程的副作用,然后以任何方式等待该线程。
当现实是
导入(任何地方)不应该有产生新线程然后以任何方式等待的副作用。
如果现实是真的,那么和说同样的事情并没有太大区别
进口不应该等待。
记录可以等待。 导入的代码执行日志记录是否安全?
如果是这样,我们怎么能相信它?
如果不是,我们如何调试处理数据的导入代码? 或者,最好只在导入的代码中进行简单的初始化,即在函数定义之外?
很抱歉质疑规范文本,但如果手册非常简洁,并且没有提供任何示例,并且至少包含1个错误,那么这些问题肯定是有保证的。
链接地址: http://www.djcxy.com/p/87053.html