加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python相对/绝对导入(再次)

发布时间:2020-12-20 13:12:30 所属栏目:Python 来源:网络整理
导读:这个主题已被多次介绍过,但我还是无法让我的包工作. 情况就是这样:我有一个包,其中一个日志记录模块负责设置日志记录. 很明显,mypackage.logging与标准库中的 Python日志记录冲突. 目录’结构: ├── mypackage│?? ├── __init__.py│?? ├── loggin
这个主题已被多次介绍过,但我还是无法让我的包工作.
情况就是这样:我有一个包,其中一个日志记录模块负责设置日志记录.
很明显,mypackage.logging与标准库中的 Python日志记录冲突.

目录’结构:

├── mypackage
│?? ├── __init__.py
│?? ├── logging.py
└── script.py

mypackage的.__ init__

import logging
from . import logging as _logging

logger = logging.getLogger(__name__)

def main():
    _logging.init_logging()
    logger.info("hello")

mypackage.logging

"""logging - Setup logging for mypackage."""

import copy
import logging
import logging.config


_DEFAULT_LOGGING_CONFIG_DICT = {
    'version': 1,'formatters': {
        'verbose': {
            'format': '%(asctime)s - %(name)s::%(levelname)s: %(message)s',},'simple': {
            'format': '-- %(message)s','handlers': {
        'console': {
            'class': 'logging.StreamHandler','level': 'DEBUG','formatter': 'simple','file': {
            'class': 'logging.FileHandler','filename': 'oprpred.log','mode': 'w','formatter': 'verbose','loggers': {
        'oprpred': {
            'level': 'INFO','root': {
        'level': 'INFO','handlers': ['console','file'],}

def init_logging(verbose=False):
    """Initialize logging.

    Set the log level to debug if verbose mode is on.
    Capture warnings.
    """
    d = default_logging_dict()
    if verbose:
        d['root']['level'] = 'DEBUG'
        d['loggers']['oprpred']['level'] = 'DEBUG'
    logging.config.dictConfig(d)
    logging.captureWarnings(True)


def default_logging_dict():
    return copy.deepcopy(_DEFAULT_LOGGING_CONFIG_DICT)

script.py

import mypackage
mypackage.main()

最后,这是我得到的错误消息:

$python3 script.py                                                                                                                                                                     [11:09:01]
Traceback (most recent call last):
  File "script.py",line 4,in <module>
    mypackage.main()
  File "/Users/benoist/Desktop/test_logging/mypackage/__init__.py",line 8,in main
    _logging.init_logging()
AttributeError: module 'logging' has no attribute 'init_logging'

最后一点,我注意到如果在mypackage .__ init.py__中我在标准库日志记录之前导入mypackage.logging,它就可以了.
我不想这样做,因为它违反了Python PEP8的建议:

Imports should be grouped in the following order:

  1. standard library imports
  2. related third party imports
  3. local application/library specific imports

任何帮助将不胜感激.

本.

附:我正在使用Python 3.5.1.

解决方法

我处理使用自定义日志记录模块这一特定问题的方法是将所有日志记录功能导入我的自定义模块.现在,您还可以使用自定义版本重新实现模块级功能.

例如:

"""logging - Setup logging for mypackage."""

import copy
from logging import *
import logging.config


_DEFAULT_LOGGING_CONFIG_DICT = { ... }

def init_logging(verbose=False):
    ...

def default_logging_dict():
    ...

现在您只需要导入自定义模块.

from . import logging

log = logging.getLogger()

使用from logging import *的替代方法是从内置日志记录模块重新实现任何常用函数.

import copy
import logging

def getLogger(*args,**kwargs):
    logging.getLogger(*args,**kwargs)

如果您需要访问尚未重新实现的日志记录功能,则可以调用内置日志记录模块,例如:logging.logging.addLevelName(…).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读