【问题标题】:Does this code follow Python coding standards\style and idioms?此代码是否遵循 Python 编码标准\样式和习语?
【发布时间】:2011-05-02 06:33:22
【问题描述】:

我已经在 log.py 中编写了这段代码。

import logging
import os


# make directory
directory = 'logs'
if not os.path.exists(directory):
  os.makedirs(directory)

# create logger
logger = logging.getLogger('testfile')
logger.setLevel(logging.DEBUG)


loghandler = logging.FileHandler(directory + '\log.txt')

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# add formatter to loghandler
loghandler.setFormatter(formatter)

# add loghandler to logger
logger.addHandler(loghandler)

现在,用户可以在任何模块中使用它,例如

import log
log.logger.warn("gjh")

【问题讨论】:

    标签: python coding-style


    【解决方案1】:

    您正在为单个全局对象创建一个完整的模块。如果你想保存代码,只要有一个创建它的函数:

    def make_logger():
      logger = logging.getLogger('testfile')
      # initializations...
      # ...
      return logger
    
    logger = make_logger()
    logger.warn('ghj')
    

    使用关键字参数和默认值,您还可以在需要时轻松自定义其创建(随着您的程序变得越来越复杂,它可能会出现)。

    【讨论】:

    • 但是,每次我从不同的模块调用 make_logger() 时,它不会创建一个新对象吗?没关系吗?
    • @ruskin:所以使用一个对象并传递对它的引用。我仍然不会为日志对象制作一个模块。无论如何,某些顶级对象/模块必须创建记录器,因此它可以“拥有”它并传递给其他需要它的模块
    【解决方案2】:

    我发现了几个问题

    1. 显然您使用两个空格缩进,而这个is a crime in Python
    2. 您正在使用'\log.txt',这只是因为小写 L 作为控制字符没有特殊含义。最好使用特定于操作系统的路径构造函数(参见os.path.join

    【讨论】:

      【解决方案3】:

      关于编码风格,我建议使用专用工具。之前有过一些帖子,比如这个:PyLint, PyChecker or PyFlakes?

      就我个人而言,我更喜欢将pylint 与适合我希望在我的项目中遵循的某些内容(例如特殊变量名)的配置文件一起使用。如果您想快速浏览一下,请尝试pep8

      最好的问候,雷纳

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 2012-11-06
        相关资源
        最近更新 更多