คำเตือน Cell-var-from-loop จาก Pylint


94

สำหรับรหัสต่อไปนี้:

for sort_key, order in query_data['sort']:
    results.sort(key=lambda k: get_from_dot_path(k, sort_key),
                 reverse=(order == -1))

Pylint รายงานข้อผิดพลาด:

Sort_key ตัวแปรของเซลล์ที่กำหนดไว้ในลูป (cell-var-from-loop)

ใครช่วยให้คำใบ้ว่าเกิดอะไรขึ้นที่นี่? จากซอร์สโค้ด pylint คำอธิบายคือ:

ตัวแปรที่ใช้ในการปิดถูกกำหนดในลูป ซึ่งจะส่งผลให้การปิดทั้งหมดโดยใช้ค่าเดียวกันสำหรับตัวแปรปิด

แต่ฉันไม่รู้ว่ามันหมายถึงอะไร ใครช่วยยกตัวอย่างปัญหาได้ไหม


เป็นวัตถุชนิดใดresults? รายการสามัญ? อื่น ๆ อีก?
Kevin


@ เควินเช่นผลลัพธ์ = [{คีย์: ค่า}, {คีย์: ค่า} ... ]
xis

ตกลง. ในกรณีนี้ฉันเห็นด้วยกับ chepner ว่าคุณไม่จำเป็นต้องกังวลเกี่ยวกับคำเตือนที่นี่
Kevin

คำตอบ:


105

ชื่อsort_keyในเนื้อหาของlambdaพินัยกรรมจะถูกค้นหาเมื่อมีการเรียกใช้ฟังก์ชันจริงดังนั้นจึงจะเห็นค่าsort_keyล่าสุด เนื่องจากคุณกำลังโทรsortทันทีค่าของsort_keyจะไม่เปลี่ยนแปลงก่อนที่จะใช้วัตถุฟังก์ชันที่เป็นผลลัพธ์ดังนั้นคุณจึงสามารถเพิกเฉยต่อคำเตือนได้อย่างปลอดภัย หากต้องการปิดเสียงคุณสามารถsort_keyกำหนดค่าเริ่มต้นของพารามิเตอร์เป็นlambda:

results.sort(key=lambda k, sk=sort_key: get_from_dot_path(k, sk),
             reverse=(order == -1))

5
ฉันทำพลาดในการแก้ไขปัญหาแทนที่จะเพิกเฉยต่อคำเตือน ถ้าเป็นไปได้ฉันจะใช้key=partial(get_from_dot_path, foo=sort_key)แทนนิพจน์แลมบ์ดา (สมมติว่ามีชื่อพารามิเตอร์บางตัวที่fooกำหนดโดยget_from_dot_pathคุณสามารถใช้สำหรับอาร์กิวเมนต์คำหลักpartialอนุญาตให้กรอกพารามิเตอร์ตำแหน่งจากด้านซ้ายเท่านั้น)
chepner

1
ฉันไม่รู้ว่านี่จะแก้ไขได้ฉันคิดว่ามันเทียบเท่ากัน ในกรณีนี้ฉันเห็นด้วย
timdiels

3
โปรดทราบว่าปัจจุบันเคล็ดลับไม่ได้ผลเสมอไปgithub.com/PyCQA/pylint/issues/3107
Daniel Pinyol
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.