Trong Python, có hai loại đối số: positional (vị trí) và keyword (từ khóa). Các đối số phải xuất hiện thứ tự cụ thể nếu không trình thông dịch Python báo lỗi.
Trong hướng dẫn này, nói về lỗi "positional argument follows keyword argument" và tại sao nêu lên. Chúng ta xem đoạn mã ví dụ lỗi này để đi qua cách khắc phục.
Hãy bắt đầu!
Vấn đề: positional argument follows keyword argument
Xem lỗi đầy đủ:
SyntaxError: positional argument follows keyword argument
Giống ngôn ngữ tự nhiên, ngôn ngữ lập trình có quy tắc riêng. Quy tắc gọi là cú pháp (syntax). Lỗi là syntax error nghĩa là vi phạm quy tắc viết mã Python.
Phần tiếp theo lỗi cho biết nguyên nhân. Trong trường hợp này, mã có positional argument xuất hiện sau keyword argument.
Positional arguments là đối số xuất hiện vị trí tương ứng:
def add_numbers(a, b): return a + b Let's call this function: add_numbers(2, 3)
"a" và "b" thành biến bên trong hàm. Mã hoạt động vì chỉ định hai positional arguments. "a" bằng 2 và "b" bằng 3. Chúng ta cũng chỉ định đối số như keyword arguments:
81% người tham gia cho biết họ cảm thấy tự tin hơn về cơ hội việc làm công nghệ sau khi tham gia bootcamp. Được ghép nối với bootcamp ngay hôm nay.
Sinh viên trung bình tốt nghiệp bootcamp mất chưa đến sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được việc đầu tiên.
add_numbers(a=2, b=2)
Tuy nhiên, không thể chỉ định positional argument trước rồi chuyển sang cú pháp keyword.
Vì Python có hàm đặc biệt *args xử lý nhiều đối số trong hàm. Xem mã:
def show_users(a, b, *args): print(a, b, *args)
Mã này dùng *args. Từ khóa đại diện số lượng đối số biến đổi. Có thể truyền bao nhiêu đối số cho show_users() tùy ý:
show_users("Alex", "Peter", "Violet', "Julie") Mã trả về: Alex Peter Violet Julie
Hai đối số đầu, "a" và "b", có giá trị "Alex" và "Peter".
Điều này vì nếu dùng cú pháp positional, đối số gán theo thứ tự truyền. Đối số cuối xuất hiện thứ tự nêu vì *args đại diện số lượng đối số thêm không xác định.
Tình huống ví dụ
Xem đoạn mã lỗi:
def print_menu(salads, pizzas): print("Salad Menu") for s in salads: print(s) print("") print("Pizza Menu") for p in pizzas: print(p) Hàm chấp nhận hai đối số: salads và pizzas. Hàm in mỗi salad menu salad và pizza menu pizza ra console.
Hãy gọi hàm:
salads = ["Tuna Salad", "Lettuce and Mango Salad", "Greek Salad"] pizzas = ["Veggie Supreme", "Ham and Pineapple", "BBQ Chicken"] print_menu(pizzas=pizzas, salads)
Mã trả về:
File "main.py", line 13 print_menu(pizzas=pizzas, salads) ^ SyntaxError: positional argument follows keyword argument
Có lỗi mã, như mong đợi. Hãy khắc phục.
Giải pháp
Để khắc phục, đảm bảo tất cả positional arguments đứng trước keyword arguments. Hãy đổi cách gọi hàm phản ánh quy tắc:
print_menu(salads, pizzas)
Chỉ định hai positional arguments: salads và pizzas. Thay vào đó, chỉ định "pizzas" như keyword argument sau "salads":
print_menu(salads, pizzas = pizzas)
Trong ví dụ này, không cần thêm keyword arguments vì không dùng *args. Tuy nhiên, thêm keyword arguments làm mã dễ đọc hơn tùy số giá trị truyền vào hàm.
Hãy chạy mã với gọi hàm sửa:
Salad Menu Tuna Salad Lettuce and Mango Salad Greek Salad Pizza Menu Veggie Supreme Ham and Pineapple BBQ Chicken
Mã in thành công hai list Python.
Kết luận
Positional arguments phải xuất hiện trước keyword argument trong Python. Vì Python dịch positional arguments theo thứ tự xuất hiện. Sau đó, dịch keyword arguments chỉ định.
Bây giờ bạn đã sẵn sàng giải quyết lỗi "positional argument follows keyword argument" như chuyên gia Python!