2.15. Argumen¶
Sebuah fungsi dapat dipanggil dengan beberapa cara, dan parameternya dapat dideklarasikan dalam berbagai bentuk. Kombinasinya terlihat menakutkan pada awalnya; tiga atau empat pola mencakup hampir semua hal dalam praktiknya.
2.15.1. Argumen posisional dan kata kunci¶
Pemanggilan paling sederhana meneruskan argumen berdasarkan posisi -- nilai pertama ke parameter pertama, nilai kedua ke parameter kedua, dan seterusnya:
def rect(x, y, w, h):
return (x, y, w, h)
rect(10, 20, 100, 50)
Pemanggilan yang sama dapat meneruskan argumen berdasarkan kata kunci, dengan menamai setiap parameter secara eksplisit:
rect(x=10, y=20, w=100, h=50)
Argumen kata kunci tidak bergantung pada urutan dan membuat pemanggilan mudah dipahami dengan mengorbankan pengetikan yang lebih banyak. Argumen posisional dan kata kunci dapat dicampur dalam satu pemanggilan, tetapi setiap argumen posisional harus muncul sebelum kata kunci mana pun:
rect(10, 20, w=100, h=50) # OK
rect(x=10, 20, 100, 50) # SyntaxError
2.15.2. Nilai default¶
Sebuah parameter dapat mendeklarasikan nilai default yang digunakan ketika pemanggil tidak menyediakan nilai:
def greet(name, greeting="hello"):
print(greeting, name)
greet("Alice") # hello Alice
greet("Alice", "hi") # hi Alice
greet("Alice", greeting="hey") # hey Alice
Parameter dengan nilai default harus ditempatkan setelah parameter tanpa default pada baris def.
Peringatan
Nilai default dievaluasi sekali saja, saat def dijalankan -- bukan pada setiap pemanggilan. Menggunakan default yang dapat diubah ([], {}) menyebabkan objek yang sama dibagikan di setiap pemanggilan yang menggunakan default tersebut. Gunakan None sebagai sentinel sebagai gantinya:
def append_to(item, target=None):
if target is None:
target = []
target.append(item)
return target
2.15.3. Panjang variabel: *args dan **kwargs¶
Parameter yang diawali dengan * mengumpulkan sisa argumen posisional ke dalam sebuah tuple. Parameter yang diawali dengan ** mengumpulkan sisa argumen kata kunci ke dalam sebuah dict. Nama konvensionalnya adalah args dan kwargs, tetapi pengenal apa pun dapat digunakan:
def report(label, *values, **options):
print(label, values, options)
report("temps", 21, 22, 23, unit="C", precision=1)
Output:
temps (21, 22, 23) {'unit': 'C', 'precision': 1}
Sebuah fungsi jarang membutuhkan keduanya. Penggunaan yang paling umum adalah meneruskan argumen dari fungsi pembungkus ke pemanggilan dalam:
def log_and_call(func, *args, **kwargs):
print("calling", func.__name__)
return func(*args, **kwargs)
Sintaks cermin di sisi pemanggilan membongkar iterable menjadi argumen posisional (*) atau dict menjadi argumen kata kunci (**):
point = (10, 20, 100, 50)
rect(*point) # same as rect(10, 20, 100, 50)
kwargs = {"x": 10, "y": 20, "w": 100, "h": 50}
rect(**kwargs) # same as rect(x=10, y=20, ...)
2.15.4. Parameter khusus kata kunci¶
Sebuah * yang berdiri sendiri dalam daftar parameter (tidak terlampir pada nama) menandai setiap parameter berikutnya sebagai khusus kata kunci -- pemanggil harus menggunakan nama:
def crop(buffer, *, x, y, w, h):
...
crop(buffer, x=0, y=0, w=100, h=100) # OK
crop(buffer, 0, 0, 100, 100) # TypeError
Gunakan ini untuk tanda boolean (flag) dan argumen lain di mana nilai kosong pada sisi pemanggilan tidak akan mudah dipahami.