如何访问上游(命名空间)模块实例详细信息而不知道它是否存在?

时间:2013-01-06 17:40:58

标签: python logging namespaces python-2.7 global-variables

回答Leenert Regebro的信用: 显然我的直觉是正确的,这是不可能的。而且很明显,因为两小时内只有一个答案。 感谢所有的奖励。

我的Google-foo让我失望。

我正在编写一个自定义异常库作为模块,用于单个发布者下的多个项目。我可能在其他项目中没有发言权,或者我可能有发言权。因此,我和其他人都可以使用它。 “和其他人”是这里的问题。在我的例外模块中,将有使用logging模块输出回溯等特定功能来记录日志文件。这对我来说很好,因为我使用logging模块。

但是如果其他人(不使用logging)使用异常库,我需要跳过日志记录部分。尝试...除了解决这个问题,但如果他们使用logging怎么办?在这种情况下,我需要能够确定他们的日志记录方案(控制台/文件/流,文件名等)。这样我就可以创建一个子记录器,它将写入他们的文件(或控制台或你有什么):

<snip>
their_logger = THE_FUNCTION_I_CANNOT_FIGURE_OUT_HOW_TO_WRITE()
temp_var = their_logger.name + ".ExceptionLogger"
myLogger = logging.getLogger(temp_var)
</snip>

显然我可以创建一个单独的类或函数来实例化我的模块并让它接收类型为logging.logger的参数,但如果有可能的话,我宁愿用这个来证明这一点。

我甚至无法检查globalglobals() dict中是否有我知道的值,因为其他程序员可能不会使用它。

有没有办法做到这一点? (假设我的库已被导入,可能不是顶级应用程序...)我个人从未试图从名称空间中的上游获取数据,而在没有明确传递的情况下可以在较低的命名空间中使用,我怀疑它是否均匀可能,但是那里有很多程序员,有没有人实现过这个目标?

1 个答案:

答案 0 :(得分:3)

默认情况下包含可选配置是个坏主意。默认情况下不添加日志记录细节,而是通过try / except隐藏它来进行某种疯狂猜测,将代码部分放入函数中,并明确地从代码中调用它。

你不能防止白痴的事情。事实上,你拥有的魔法和隐藏的逻辑越多,它就越不具有愚蠢的证据,而且很快它就会变得非常智能,因为它很难理解魔法。

所以请按照你的想法制作一个函数并改为传入记录器。