我想确保我们的代码库上没有开发人员可以检查使用strftime
的代码。这是一个非常有用的方法,但由于它是can't be used on dates before 1900,它是我们只有在代码生效后才会发现的错误源。
我想过几种方法可以使它无法使用:
在Intellij中创建一个检查,在遇到strftime
时抛出错误。
(这似乎没问题,但创建Intellij检查是一件大事。)
创建一个单元测试,用于解决当前代码中的任何更改,并确保strftime
没有重新进入。
(似乎hacky并为某些git工具添加依赖项。)
创建某种类型的git钩子,当strftime出现在提交中时会爆炸。
(看看这个但是git hooks必须手动符号链接哪种方式会失败点。)
使用datetime
模块对NotImplemented
模块进行子类化,如果使用strftime
则会引发{{1}}错误。
(但人们仍然可以导入常规日期时间模块。)
只是训练自己和其他人,这是魔鬼。
(但到目前为止这还没有奏效。)
我觉得这可能是一种标准的解决方法。有什么建议吗?
答案 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: