簡體   English   中英

Python內置函數作為關鍵字參數默認值嗎?

[英]Python builtin function as keyword argument default?

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)

Python的內置函數是否不可用作關鍵字默認值

它們可以像其他功能一樣使用。

但是,在Python 2中print是一個語句,而不是一個函數。 它成為Python 3中的函數,因此您的代碼將在其中運行。 如果from __future__ import print_function使用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

在Python 2中, print不是函數,而是語句。 語句不能用作參數。

在Python 3中, print是一個函數,可以按您的方式使用。

您可以通過from __future__ import print_function Python 2中的Python 3行為。

您正在使用python 2,其中print是一個關鍵字而不是一個函數-當然關鍵字不能作為參數傳遞,也不能被陰影或修改。 在python 3中已對此進行了更改,現在print是一個可以實現所有這些功能的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM