about 3 years ago

Use None and Docstrings to Specify Dynamic Default Arguments

這個算是 Python 初學者的地雷之一,連 Python tutorial 都特別提出來。

下面的程式有問題,因為 datetime.now() 只會執行一次。

from time import sleep
from datetime import datetime

def log(message, when=datetime.now()):
    print('%s: %s' % (when, message))

解決方式是不要用 mutable 當預設值,一般是使用 None,然後將用法寫清楚 (docstrings)

def log(message, when=None):
    """Log a message with a timestamp.
    Args:
        message: Message to print.
        when: datetime of when the message occurred.
            Defaults to the present time.
    """
    when = datetime.now() if when is None else when
    print('%s: %s' % (when, message))

相關

Python 慣用語 - 11 避免用 mutable 預設引數

← Effective Python 心得筆記: Item 19 Effective Python 心得筆記: Item 21 →
 
comments powered by Disqus