Sementara sebagian besar jawaban mengatakan bahwa, misalnya,
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
sama dengan"
def f(foo=None, bar=None, **kwargs):
...etc...
ini tidak benar. Dalam kasus terakhir, f
bisa disebut sebagai f(23, 42)
, sementara kasus yang pertama menerima suatu argumen bernama hanya - tidak ada panggilan posisional. Seringkali Anda ingin memberikan fleksibilitas maksimum kepada penelepon dan karena itu bentuk kedua, seperti yang dinyatakan sebagian besar jawaban, lebih disukai: tetapi itu tidak selalu terjadi. Ketika Anda menerima banyak parameter opsional yang biasanya hanya sedikit yang dilewati, mungkin ide yang bagus (menghindari kecelakaan dan kode yang tidak dapat dibaca di situs panggilan Anda!) Untuk memaksa penggunaan argumen yang disebutkan - threading.Thread
adalah contohnya. Bentuk pertama adalah bagaimana Anda menerapkannya di Python 2.
Ungkapan ini sangat penting sehingga dalam Python 3 sekarang memiliki sintaks pendukung khusus: setiap argumen setelah satu *
di def
tanda tangan adalah kata kunci saja, yaitu, tidak dapat dilewatkan sebagai argumen posisi, tetapi hanya sebagai yang bernama. Jadi dalam Python 3 Anda bisa kode di atas sebagai:
def f(*, foo=None, bar=None, **kwargs):
...etc...
Memang, dalam Python 3 Anda bahkan dapat memiliki argumen hanya kata kunci yang bukan opsional (yang tanpa nilai default).
Namun, Python 2 masih memiliki tahun-tahun panjang kehidupan produktif di masa depan, jadi lebih baik untuk tidak melupakan teknik dan idiom yang memungkinkan Anda menerapkan dalam Python 2 ide-ide desain penting yang secara langsung didukung dalam bahasa di Python 3!