2012-12-12 102 views
1

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) 

相反,我只好勉強與無的默認參數作爲一個標誌值這樣做。

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) 

回答

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 
2

在Python 2,print不是一個函數,它是一個聲明。語句不能用作參數。

在Python 3中,print是一個函數,可以像你這樣操作。

您可以通過執行from __future__ import print_function來獲得Python 2中的Python 3行爲。

1

您正在使用python 2,其中print是一個關鍵字,而不是一個函數 - 當然,關鍵字不能作爲參數傳遞,或者被映射或修改。這已經在python 3中改變了,print現在是一個所有這些都可能的函數。

相關問題