Python:导入带有参数的模块?

瑞娜

我有一个小的日志记录包装器模块test.logging

import logging

debuglog = "debug.log"
f = open(debuglog, 'w') # truncate the file
f.close()

logger = logging.getLogger('test')
logger.setLevel(logging.INFO)

formatter = logging.Formatter(
    '%(asctime)s %(name)s %(levelname)s: %(filename)s:%(lineno)d: %(message)s')

fh = logging.FileHandler(debuglog)
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)

def get(moduleName):
    return logging.getLogger("test." + moduleName)

以及一些使用它的模块,例如test.example

import test.logging
logger = test.logging.get(__name__)

logger.info("This is an info message from test.example")

我想知道是否有一种方法可以减少出现在的每个子模块中的前两行的重复test我想做类似的事情:

from test.logging get(__name__) as logger
logger.info("This is an info message from test.example")

甚至更好,如果我也可以省略__name__get()自动确定模块名称。(从我收集到的信息来看,这可以通过inspect模块实现,但是如果调用方被修饰或程序被编译为EXE,则可能不正确。)

这样的事情可能吗?

马丁·彼得斯(Martijn Pieters)

就我个人而言,我会坚持使用您拥有的代码;更少的魔术,更多的清晰度。

您可以使用以下方法通过访问堆栈中的框架来访问调用代码的模块名称sys._getframe()

import sys

def get(moduleName=None):
    if moduleName is None:
        caller = sys._getframe(1)
        moduleName = caller.f_globals['__name__']
    return logging.getLogger("test." + moduleName)

使模块名称为可选:

from test import logging
logger = logging.get()

是的,如果您的调用logging.get()是在装饰器函数内部,那么从理论上讲,您可以访问另一组全局变量(装饰器在其中定义的那些模块),但是在大多数情况下,这恰好是模块名, d要使用。通过将其设置为moduleName 可选,您可以保留为极端情况明确设置的可能性。

将Python程序打包到可执行文件(具有py2exe或相似的文件)可能会影响文件名(尤其是对于主脚本),但是模块名称应保持不变。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在python中导入带有参数的模块

来自分类Dev

Python:导入带有参数的模块?

来自分类Dev

带有iis导入模块的Python

来自分类Dev

带有“当前目录”导入的导入模块

来自分类Dev

带有“当前目录”导入的导入模块

来自分类Dev

导入问题 Python3:从带有 api 模块的烧瓶项目的包导入

来自分类Dev

带有子模块导入的名称空间

来自分类Dev

带有 Executionpolicy RemoteSigned 的导入模块 PoshRSJob

来自分类Dev

带有通用类型参数的导入方法

来自分类Dev

Coffeescript require模块带有参数,browserify

来自分类Dev

Ruby on Rails,包括带有参数的模块

来自分类Dev

如何模拟带有参数的模块

来自分类Dev

如何导入文件名中带有句点的Python 3模块?

来自分类Dev

导入带有类定义的python模块时发生意外行为

来自分类Dev

从具有位置命令行参数的Python模块导入函数

来自分类Dev

导入错误:没有带有 sudo 的名为 pyaudio 的模块

来自分类Dev

没有sudo的python模块导入错误

来自分类Dev

Python 模块没有属性导入错误

来自分类Dev

如何导入带有虚线路径的模块?

来自分类Dev

如何使用@testable导入带有空格的模块

来自分类Dev

导入带有C绑定的代码的Pickle模块

来自分类Dev

如何导入带有虚线路径的模块?

来自分类Dev

使用Python的子进程模块运行带有命令行参数的程序

来自分类Dev

如何在Python的argparse模块中收集两个带有多个参数的选项?

来自分类Dev

Python是否在模块路径中导入所有模块?

来自分类Dev

Python中带有unittest的相对导入

来自分类Dev

python:阻止导入的模块解析命令行参数

来自分类Dev

python:带有前缀“。”的模块名称

来自分类Dev

带有urllib模块的Python程序

Related 相关文章

热门标签

归档