Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python2.7中完全禁止打印关键字?_Python_Python 2.7 - Fatal编程技术网

如何在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配置,其中包括,并且代码使用自动格式化,以便于开发人员满足这些要求。

使用默认值的put
args
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一样