ประกาศฟังก์ชันที่ส่วนท้ายของไฟล์ใน Python


94

เป็นไปได้หรือไม่ที่จะเรียกใช้ฟังก์ชันโดยไม่ได้กำหนดฟังก์ชันทั้งหมดไว้ก่อน เมื่อพยายามนี้ฉันได้รับข้อผิดพลาด: " function_name is not defined" ฉันมาจากพื้นหลัง C ++ ดังนั้นปัญหานี้จึงทำให้ฉันสะดุด

การประกาศฟังก์ชันก่อนทำงาน:

def Kerma():
        return "energy / mass"    

print Kerma()

อย่างไรก็ตามการพยายามเรียกใช้ฟังก์ชันโดยไม่กำหนดก่อนจะทำให้เกิดปัญหา:

print Kerma()

def Kerma():
    return "energy / mass"

ใน C ++ คุณสามารถประกาศฟังก์ชันหลังการโทรได้เมื่อคุณวางส่วนหัวไว้ข้างหน้า

ฉันขาดอะไรที่นี่?


5
ใน Python ไม่มี "ประกาศ" มีคำจำกัดความ (ซึ่งต้องสมบูรณ์) หรือไม่มีอะไรเลย
ล็อตต์

2
คุณพูดว่า "มันทำให้เกิดปัญหา" คุณสามารถอธิบายได้หรือไม่?
Martin Del Vecchio


เผื่อใครสงสัย:Kerma is an acronym for "kinetic energy released per unit mass"
anon

1
ฉันรู้ว่ามันเก่ามาก แต่ทำไมไม่มีใครแนะนำให้ใส่ฟังก์ชั่นใน.pyไฟล์แยกต่างหากและนำเข้า มีผลกระทบที่ไม่ได้ตั้งใจหรือไม่?
Kyle

คำตอบ:


145

วิธีหนึ่งที่เป็นสำนวนใน Python คือการเขียน:

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __name__ == '__main__':
    main()

สิ่งนี้ช่วยให้คุณสามารถเขียนโค้ดตามลำดับที่คุณต้องการตราบเท่าที่คุณยังคงเรียกใช้ฟังก์ชันmainในตอนท้าย


4
@ มูฮัมมัด: แม้ว่านี่จะเป็นวิธีการที่ใช้ได้ผล แต่ก็ไม่ใช่สำนวนใน Python ในทางตรงกันข้ามคุณจะสังเกตเห็นว่าmainฟังก์ชันส่วนใหญ่มักจะวางไว้ที่ส่วนท้าย
Eli Bendersky

15
@Eli Bendersky: ฉันขอส่งว่าif __name__ == '__main__':สวิตช์เป็นส่วนสำนวนทั่วไป
S.Lott

2
@Eli: ส่วนสำนวนคือถ้าข้อที่สิ้นสุด: รหัสที่ระดับบนสุดของโมดูลไม่มีแล้วในตอนท้ายเรียกใช้ฟังก์ชั่นหลักถ้าโมดูลเป็นหลัก
Ned Batchelder

1
@ เอลี: ส่วนที่เป็นสำนวนคือif ... __main__':. ฉันไม่ได้บอกว่าmainควรวางไว้เหนือส่วนที่เหลือของรหัส ฉันบอกว่าส่วนสำคัญคือการเรียกร้อง_\_main__ในตอนท้ายและไม่สำคัญว่าคุณจะวางนิยามไว้ที่ใด
มูฮัมหมัดอัลคารูรี

2
ด้วย if name == ' main ': เปลี่ยนมันจะไม่เกี่ยวข้องกับวิธีที่คุณสั่งฟังก์ชันของคุณ นั่นคือสิ่งที่ถูกต้อง (TM) ที่จะทำ
MKesper

18

เมื่อเรียกใช้โมดูล Python (ไฟล์. py) คำสั่งระดับบนสุดในนั้นจะดำเนินการตามลำดับที่ปรากฏจากบนลงล่าง (ต้นจนจบ) ซึ่งหมายความว่าคุณไม่สามารถอ้างอิงบางสิ่งได้จนกว่าคุณจะกำหนดไว้ ตัวอย่างต่อไปนี้จะสร้างข้อผิดพลาดที่แสดง:

c = a + b  # -> NameError: name 'a' is not defined
a = 13
b = 17

ไม่เหมือนกับภาษาอื่น ๆdefและclassคำสั่งสามารถเรียกใช้งานได้ใน Python ไม่ใช่แค่การประกาศดังนั้นคุณจึงไม่สามารถอ้างอิงได้aหรือbจนกว่าจะเกิดเหตุการณ์นั้นขึ้น นี่คือสาเหตุที่ตัวอย่างแรกของคุณมีปัญหา - คุณกำลังอ้างถึงKerma()ฟังก์ชันก่อนที่defคำสั่งจะดำเนินการและร่างกายได้รับการประมวลผลและอ็อบเจ็กต์ฟังก์ชันที่เป็นผลลัพธ์ถูกผูกไว้กับชื่อของฟังก์ชันดังนั้นจึงไม่ได้กำหนดไว้ ณ จุดนั้นในสคริปต์

โปรแกรมในภาษาเช่น C ++ มักจะถูกประมวลผลล่วงหน้าก่อนที่จะรันและในระหว่างขั้นตอนการคอมไพล์นี้โปรแกรมทั้งหมดและ#includeไฟล์ใด ๆ ที่อ้างถึงจะถูกอ่านและประมวลผลทั้งหมดในครั้งเดียว ซึ่งแตกต่างจาก Python ภาษานี้มีคำสั่งที่เปิดเผยซึ่งอนุญาตให้มีการประกาศชื่อและลำดับการเรียกของฟังก์ชัน (หรือประเภทคงที่ของตัวแปร) (แต่ไม่ได้กำหนดไว้) ก่อนใช้งานดังนั้นเมื่อคอมไพเลอร์พบชื่อของพวกเขาจะมีข้อมูลเพียงพอที่จะตรวจสอบ การใช้งานซึ่งส่วนใหญ่เกี่ยวข้องกับการตรวจสอบประเภทและประเภทการแปลงซึ่งยังไม่มีการกำหนดเนื้อหาหรือเนื้อความจริงของรหัส


ไม่ใช่ว่าภาษาแบบไดนามิกไม่สามารถทำได้ Perl เป็นภาษาไดนามิกและคุณสามารถเรียกใช้ฟังก์ชันก่อนที่จะกำหนดได้ นั่นเป็นเพราะมันมีเฟสคอมไพล์และเฟสรัน (แม้ว่าจะแปลก แต่มีประโยชน์คุณสามารถจัดเรียงเพื่อรันโค้ดในระหว่างเฟสคอมไพล์) งานนี้: doit(); sub doit { print("I'm doing it!\n"); }
John Deighan

9

สิ่งนี้ไม่สามารถทำได้ใน Python แต่ตรงไปตรงมาคุณจะพบว่าคุณไม่ต้องการมันเลยในไม่ช้า วิธีเขียนโค้ดแบบ Pythonic คือการแบ่งโปรแกรมของคุณออกเป็นโมดูลที่กำหนดคลาสและฟังก์ชันและ "โมดูลหลัก" เดียวที่นำเข้าและรันอื่น ๆ ทั้งหมด

สำหรับสคริปต์แบบโยนทิ้งอย่างง่ายให้คุ้นเคยกับการวาง "ส่วนปฏิบัติการ" ที่ส่วนท้ายหรือดีกว่านั้นให้เรียนรู้การใช้ Python shell แบบโต้ตอบ


1

Python เป็นตัวแปรแบบไดนามิกและล่ามจะรับสถานะของตัวแปร (ฟังก์ชั่น, ... ) เสมอในขณะที่เรียกใช้ คุณยังสามารถกำหนดฟังก์ชันใหม่ใน if-blocks บางอย่างและเรียกใช้งานในแต่ละครั้งไม่เหมือนกัน นั่นเป็นเหตุผลที่คุณต้องกำหนดก่อนที่จะเรียกมัน


1

หากคุณยินดีที่จะเป็นเหมือน C ++ และใช้ทุกอย่างภายในฟังก์ชัน คุณสามารถเรียกใช้ฟังก์ชันแรกจากด้านล่างของไฟล์ดังนี้:

def main():
    print("I'm in main")
    #calling a although it is in the bottom
    a()

def b():
   print("I'm in b")

def a():
   print("I'm in a")
   b()

main()

วิธีนี้ python คือการ 'อ่าน' ไฟล์ทั้งหมดก่อนจากนั้นจึงเริ่มการดำเนินการ

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