1

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)
4

3 回答 3

3

Python 的内置函数是否不能用作关键字默认值

它们可以像任何其他功能一样使用。

然而,在 Python 2print中是一个语句,而不是一个函数。它成为 Python 3 中的一个函数,因此您的代码将在那里工作。如果您使用from __future__ import print_function. 例如,使用 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
于 2012-12-12T07:38:34.763 回答
2

在 Python 2 中,print它不是函数,而是语句。语句不能用作参数。

在 Python 3 中,print是一个函数,可以按照您的方式使用。

你可以通过在 Python 2 中获得 Python 3 的行为from __future__ import print_function

于 2012-12-12T07:38:47.000 回答
1

您正在使用 python 2,其中print是关键字而不是函数 - 当然关键字不能作为参数传递,或者隐藏或修改。这在 python 3 中已经改变, print 现在是一个函数,所有这些都是可能的。

于 2012-12-12T07:39:10.300 回答