在代码库中禁止`strftime`

时间:2014-11-20 21:57:40

标签: python git intellij-idea strftime unit-testing

我想确保我们的代码库上没有开发人员可以检查使用strftime的代码。这是一个非常有用的方法,但由于它是can't be used on dates before 1900,它是我们只有在代码生效后才会发现的错误源。

我想过几种方法可以使它无法使用:

  1. 在Intellij中创建一个检查,在遇到strftime时抛出错误。

    (这似乎没问题,但创建Intellij检查是一件大事。)

  2. 创建一个单元测试,用于解决当前代码中的任何更改,并确保strftime没有重新进入。

    (似乎hacky并为某些git工具添加依赖项。)

  3. 创建某种类型的git钩子,当strftime出现在提交中时会爆炸。

    (看看这个但是git hooks必须手动符号链接哪种方式会失败点。)

  4. 使用datetime模块对NotImplemented模块进行子类化,如果使用strftime则会引发{{1}}错误。

    (但人们仍然可以导入常规日期时间模块。)

  5. 只是训练自己和其他人,这是魔鬼。

    (但到目前为止这还没有奏效。)

  6. 我觉得这可能是一种标准的解决方法。有什么建议吗?

4 个答案:

答案 0 :(得分:2)

另一种方法是使用pylint代码lint。具体来说,basic_checker可用于警告何时使用禁用函数(默认用于映射,过滤等)。

您可以将其绑定为pre-commit中的git挂钩,以确保不使用违规功能。

答案 1 :(得分:1)

这是(4)的变体。我不一定确定它是最佳方式来实现这一目标,但它会起作用。将它放在顶级__init__.py中,它在其他所有内容之前运行:

import datetime

class datetime(datetime.datetime):
    # Override strftime, and make any other changes here

datetime.datetime = datetime

这将使用您的黑客版本对内置datetime.datetime实施进行修补。重要的是要意识到这将打破可能正在使用datetime.strftime()的任何依赖关系,因此在部署之前进行测试。

编辑:我不确定这是否有效,但您可能会滥用Python的警告系统来解决依赖问题。首先将您的实现更改为:

import warnings

class datetime(datetime.datetime):
    def strftime(self, *args, **kwargs):
        warnings.warn('strftime is deprecated', DeprecationWarning, stacklevel=2)
        return super(datetime, self).strftime(*args, **kwargs)

每次调用函数时,都会发出弃用警告。默认情况下会忽略弃用警告,因此不会为Django创建误报。然后,您可以安装警告过滤器,如下所示:

warnings.filterwarnings('error', 'strftime is deprecated', DeprecationWarning,
                        r'your_package(\..+)?') # regex matching your package

理论上,此过滤器应仅在your_package内的代码上引发异常。在实践中,我没有对它进行测试,所以它可能不会引起任何例外。

答案 2 :(得分:1)

另一种方法是在某些启动代码中del time.strftime

它可以检查它,但它总是会在访问时抛出AttributeError

答案 3 :(得分:1)

将它们从wxPython引入wx.DateTime类 - 一旦习惯了它,你需要一把枪让它们使用strftime - 它是一个静态类,所以可以在没有它的情况下使用wx tool chain的其余部分,在使用之前您不需要wx.App

一些features

  • 范围广:支持日期范围约为 4714 B.C 。未来将达到<4.8> 年。
  • 精确度:不在任何地方使用浮点计算可确保日期计算不会出现舍入误差。
  • 许多功能:不仅支持日期的所有常规计算,还支持更奇特的星期和年度计算,工作日测试,标准天文功能,以及严格或自由格式的字符串转换。
  • 效率:wxDateTime的对象很小(8字节),使用它们很快
  • 在某些时区知道DST。