Python内置函数作为关键字参数默认?

时间:2012-12-12 07:34:52

标签: python

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)

3 个答案:

答案 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现在是一个可以实现所有这一切的功能。