Python的内置函数不能用作关键字默认值,还是应该使用其他方式引用函数?
我想写一个这样的函数:
def isPNGBlock(bytes, blockLen, pngOffset=0, pngErrorLogger=print):
...
try:
r.validate_signature()
width, height, pixels, metadata = r.read(lenient=True)
except png.Error as e:
pngErrorLogger(e)
相反,我不得不满足于使用默认参数None作为标志值。
def isPNGBlock(bytes, blockLen, pngOffset=0, pngErrorLogger=None):
...
try:
r.validate_signature()
width, height, pixels, metadata = r.read(lenient=True)
except png.Error as e:
if pngErrorLogger is None:
print(e)
else:
pngErrorLogger(e)
或使用包装函数:
def defaultLogger(str):
print(str)
def isPNGBlock(bytes, blockLen, pngOffset=0, pngErrorLogger=defaultLogger ):
...
try:
r.validate_signature()
width, height, pixels, metadata = r.read(lenient=True)
except png.Error as e:
pngErrorLogger(e)
答案 0 :(得分:2)
Python的内置函数不能用作关键字默认值
它们可以像任何其他功能一样使用。
但是,在Python 2中print
是一个语句,而不是一个函数。它成为Python 3中的一个函数,因此您的代码将在那里工作。如果您使用from __future__ import print_function
,它也适用于最新版本的Python 2。例如,使用Python 2.7.3:
In [2]: from __future__ import print_function
In [3]: def isPNGBlock(bytes, blockLen, pngOffset=0, pngErrorLogger=print):
...: pngErrorLogger('test')
...:
In [4]: isPNGBlock(0, 0)
test
如果您不能将print
用作函数,则可以编写包装器,也可以使用sys.stdout.write
:
In [7]: isPNGBlock(0, 0, 0, sys.stdout.write)
test
答案 1 :(得分:2)
在Python 2中,print
不是函数,它是一个语句。语句不能用作参数。
在Python 3中,print
是一个函数,可以按照您的方式使用。
您可以通过执行from __future__ import print_function
来获取Python 2中的Python 3行为。
答案 2 :(得分:1)
您正在使用python 2,其中print
是关键字而不是函数 - 当然,关键字不能作为参数传递,也不能被镜像或修改。这在python 3中已经改变,print现在是一个可以实现所有这一切的功能。