Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

แก้ไข Python positional argument follows keyword argument

ใน Python มีสองประเภทของอาร์กิวเมนต์: positional arguments และ keyword arguments อาร์กิวเมนต์เหล่านี้ต้องปรากฏในลำดับเฉพาะ มิฉะนั้น Python interpreter จะคืนค่าข้อผิดพลาด

ในคู่มือนี้ เราจะพูดถึงข้อผิดพลาด "positional argument follows keyword argument" และทำไมมันจึงถูกยกขึ้น เราจะ看看ชิ้นโค้ดตัวอย่างที่มีข้อผิดพลาดนี้ เพื่อที่เราจะสามารถเดินทางผ่านวิธีแก้ไขได้

มาเริ่มกันเลย!

ปัญหา: positional argument follows keyword argument

มา看看ข้อผิดพลาดเต็มรูปแบบของเรา:

SyntaxError: positional argument follows keyword argument

เหมือนภาษาอังกฤษ ภาษาโปรแกรมมิ่งมีกฎของตัวเอง กฎเหล่านี้เรียกว่า syntax (ไวยากรณ์) ข้อผิดพลาดของเราคือ syntax error ซึ่งหมายความว่าเราล้มเหลวในการปฏิบัติตามกฎหนึ่งที่ควบคุมวิธีเขียนโค้ด Python

ส่วนต่อไปของข้อผิดพลาดบอกเราว่าสิ่งใดก่อให้เกิดข้อผิดพลาดนี้ ในกรณีนี้ โค้ดของเราต้องมี positional argument ที่ปรากฏหลัง keyword argument

Positional arguments คืออาร์กิวเมนต์ที่ปรากฏในตำแหน่งของพวกมัน:

def add_numbers(a, b): return a + b Let's call this function: add_numbers(2, 3)

"a" และ "b" กลายเป็นตัวแปรภายในฟังก์ชันของเรา โค้ดนี้ทำงานเพราะเราระบุ positional arguments สองตัว "a" เท่ากับ 2 และ "b" เท่ากับสาม เราสามารถระบุอาร์กิวเมนต์เหล่านี้เป็น keyword arguments ได้เช่นกัน:

add_numbers(a=2, b=2)

อย่างไรก็ตาม เราไม่สามารถระบุ positional argument ก่อนแล้วสลับไปใช้ไวยากรณ์ keyword ได้

นี่เป็นเพราะ Python มีฟังก์ชันพิเศษชื่อ *args ซึ่งประมวลผลอาร์กิวเมนต์หลายตัวในฟังก์ชัน พิจารณาโค้ดนี้:

def show_users(a, b, *args): print(a, b, *args)

โค้ดนี้ใช้ *args คีย์เวิร์ดนี้แทนจำนวนอาร์กิวเมนต์ที่แปรผัน เราสามารถส่งอาร์กิวเมนต์ให้ฟังก์ชัน show_users() ได้มากเท่าที่ต้องการ:

show_users("Alex", "Peter", "Violet', "Julie")

โค้ดของเราคืนค่า: Alex Peter Violet Julie

อาร์กิวเมนต์แรกสองตัว "a" และ "b" มีค่า "Alex" และ "Peter" ตามลำดับ

นี่เป็นเพราะหากคุณใช้ไวยากรณ์ positional อาร์กิวเมนต์จะถูกกำหนดในลำดับที่พวกมันถูกส่งผ่าน อาร์กิวเมนต์สุดท้ายปรากฏในลำดับที่พวกมันถูกระบุ เพราะ *args แทนจำนวนอาร์กิวเมนต์เพิ่มเติมที่ไม่ทราบ

สถานการณ์ตัวอย่าง

มา看看ชิ้นโค้ดที่ประสบข้อผิดพลาดนี้:

def print_menu(salads, pizzas): print("Salad Menu") for s in salads: print(s) print("") print("Pizza Menu") for p in pizzas: print(p)

ฟังก์ชันนี้รับสองอาร์กิวเมนต์: salads และ pizzas ฟังก์ชันของเราพิมพ์สลัดแต่ละจานในเมนูสลัดและพิซซ่าแต่ละจานในเมนูพิซซ่าไปยังคอนโซล

มาเรียกฟังก์ชันของเรา:

salads = ["Tuna Salad", "Lettuce and Mango Salad", "Greek Salad"] pizzas = ["Veggie Supreme", "Ham and Pineapple", "BBQ Chicken"] print_menu(pizzas=pizzas, salads)

โค้ดของเราคืนค่า:

File "main.py", line 13 print_menu(pizzas=pizzas, salads) ^ SyntaxError: positional argument follows keyword argument

มีข้อผิดพลาดในโค้ดของเรา ตามที่คาดไว้ มาแก้ไขมัน

วิธีแก้ไข

เพื่อแก้ปัญหานี้ เราต้องแน่ใจว่าอาร์กิวเมนต์ positional ทั้งหมดมาก่อนอาร์กิวเมนต์ keyword มาเปลี่ยนวิธีที่เราเรียกฟังก์ชันเพื่อสะท้อนกฎนี้:

print_menu(salads, pizzas)

เราระบุ positional arguments สองตัว: salads และ pizzas ทางเลือกอื่น เราสามารถระบุ "pizzas" เป็น keyword argument หลัง "salads" ได้:

print_menu(salads, pizzas = pizzas)

ในตัวอย่างนี้ ไม่จำเป็นต้องเพิ่ม keyword arguments ใดๆ เพราะเราไม่ได้ใช้เมธอด *args ด้วย ذلك กล่าวคือ การเพิ่ม keyword arguments สามารถทำให้โค้ดอ่านง่ายขึ้นขึ้นอยู่กับจำนวนค่าที่ส่งผ่านเข้าฟังก์ชัน

มารันโค้ดของเราด้วยการเรียกฟังก์ชันที่แก้ไขแล้ว:

Salad Menu Tuna Salad Lettuce and Mango Salad Greek Salad Pizza Menu Veggie Supreme Ham and Pineapple BBQ Chicken

โค้ดของเราพิมพ์รายการ Python สองรายการของเราสำเร็จแล้ว

สรุป

Positional arguments ต้องปรากฏก่อน keyword argument ใน Python นี่เป็นเพราะ Python ตีความ positional arguments ในลำดับที่พวกมันปรากฏ จากนั้น มันตีความ keyword arguments ที่ถูกระบุ

ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาด "positional argument follows keyword argument" อย่างนักพัฒนา Python มืออาชีพแล้ว!