如何在Python2.7中完全禁止打印关键字?
我将把记录器引入到我的项目中,我想禁止在其中使用打印语句。我的意图是强迫任何未来的开发人员使用记录器,并确保我替换了项目中的所有打印调用 到目前为止,我成功地限制了如何在Python2.7中完全禁止打印关键字?,python,python-2.7,Python,Python 2.7,我将把记录器引入到我的项目中,我想禁止在其中使用打印语句。我的意图是强迫任何未来的开发人员使用记录器,并确保我替换了项目中的所有打印调用 到目前为止,我成功地限制了print('foo')和print'foo'类调用: from __future__ import print_function def print(*args, **kwargs): raise SyntaxError("Don't use print! Use logger instead.") 但是仍然可以在没有参
print('foo')
和print'foo'
类调用:
from __future__ import print_function
def print(*args, **kwargs):
raise SyntaxError("Don't use print! Use logger instead.")
但是仍然可以在没有参数的情况下使用print
,目的是添加换行符,但它不会做任何事情
是否可以在不修改解释器的情况下执行此操作
编辑:
从评论中我猜我不够清楚。我只是想知道我是否可以防止打印函数出现别名
print("foo") # raises exception
print "foo" # doesn't work either
print # doesn't raise any exception, but I want it to
foo = print # this shouldn't work either like the one above, but it does
不,您不能阻止
print
语句在不使用来自未来导入打印功能的的代码中使用print
语句没有挂钩,它们直接编译到,这些操作码的实现只需直接写入stdout
或其他文件对象(使用>
表示法时)
您可以使用,但这并不比要求使用from\uuuuuuuuuuuuuuuuuuuu导入打印功能
要好
同样,如果所有代码都使用了从
导入打印函数的,而您可以将一个新的打印
函数分配给,则无法阻止某人构建自己的版本(名为打印
或其他内容)写入sys.stdout
,或执行重新加载(\uu内置)
。Python是高度动态和灵活的,我不会试图锁定它
强制执行编码标准的正常途径是使用过梁、代码审查和测试。您可以在大多数版本控制系统上安装钩子,以防止代码被签入而无法通过筛选,并且pylint
和flake8
都支持自定义插件。您可以运行一个测试,将日志记录模块配置为将所有输出定向到一个文件,然后在stdout
中写入任何内容时引发异常
这是Facebook使用的路径(在这种方法中并非只有这一条),Python代码必须通过Facebook Flake 8配置,其中包括,并且代码使用自动格式化,以便于开发人员满足这些要求。否,您不能阻止print
语句在不使用来自未来导入打印功能的的代码中使用print
语句没有挂钩,它们直接编译到,这些操作码的实现只需直接写入stdout
或其他文件对象(使用>
表示法时)
您可以使用,但这并不比要求使用from\uuuuuuuuuuuuuuuuuuuu导入打印功能
要好
同样,如果所有代码都使用了从
导入打印
函数的,而您可以将一个新的打印
函数分配给,则无法阻止某人构建自己的版本(名为打印
或其他内容)写入sys.stdout
,或执行重新加载(\uu内置)
。Python是高度动态和灵活的,我不会试图锁定它
强制执行编码标准的正常途径是使用过梁、代码审查和测试。您可以在大多数版本控制系统上安装钩子,以防止代码被签入而无法通过筛选,并且pylint
和flake8
都支持自定义插件。您可以运行一个测试,将日志记录模块配置为将所有输出定向到一个文件,然后在stdout
中写入任何内容时引发异常
这是Facebook使用的路径(在这种方法中并非只有这一条),Python代码必须通过Facebook Flake 8配置,其中包括,并且代码使用自动格式化,以便于开发人员满足这些要求。使用默认值的putargs
和kwargs
如何?我不确定它是否有效,但可能是一个解决办法。编辑:我尝试过,但它引发了异常。我建议添加单元测试,以验证日志输出是否符合预期。你也可以编写一个定制的pylint插件,在使用print
时发出linter警告。与其不信任你的开发人员并试图破坏Python,为什么不在审查时(也许是使用linter和自动格式化程序)捕捉到这一点呢?是的,linter和自动格式化程序是这个问题的完美答案,但是对于另一个完全不合适,这就是为什么我不认为它们是重复的。@SvenMarnach:对,我明白你的意思。改为写了一个答案。用默认值放置args
和kwargs
怎么样?我不确定它是否有效,但可能是一个解决办法。编辑:我尝试过,但它引发了异常。我建议添加单元测试,以验证日志输出是否符合预期。你也可以编写一个定制的pylint插件,在使用print
时发出linter警告。与其不信任你的开发人员并试图破坏Python,为什么不在审查时(也许是使用linter和自动格式化程序)捕捉到这一点呢?是的,linter和自动格式化程序是这个问题的完美答案,但是对于另一个完全不合适,这就是为什么我不认为它们是重复的。@SvenMarnach:对,我明白你的意思。我想OP担心的是,from\uuuuuuu\uuuu\uuuu导入打印功能
仍然允许裸print
语句。如果没有将来的导入,他们会向stdout写一个新行,但是有了将来的导入,他们什么也不做。我认为这基本上不是问题,但这是我如何理解问题的。我假设它在这种情况下将print
视为函数对象(我覆盖了它),就像a=print
bu一样