อะไรคือความแตกต่างระหว่างโมดูลและไลบรารีใน Python?


87

ฉันมีพื้นฐานใน Java และฉันยังใหม่กับ Python ฉันต้องการแน่ใจว่าฉันเข้าใจคำศัพท์ Python อย่างถูกต้องก่อนที่จะดำเนินการต่อ

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

ความเข้าใจของฉันเกี่ยวกับไลบรารีคือไลบรารีประกอบด้วยโมดูลจำนวนมากซึ่งแยกตามการใช้งาน

คำถามของฉันคือไลบรารีเป็นเหมือนแพ็คเกจที่คุณมีแพ็คเกจเช่นเรียกว่าfood:

  • chocolate.py
  • sweets.py
  • biscuts.py

บรรจุอยู่ในfoodแพ็คเกจ?

หรือห้องสมุดใช้แพ็คเกจดังนั้นหากเรามีแพ็คเกจอื่นdrink:

  • milk.py
  • juice.py

ที่มีอยู่ในแพ็คเกจ libraryมีสองแพคเกจ?

นอกจากนี้ส่วนต่อประสานการเขียนโปรแกรมแอปพลิเคชัน (API) มักจะมีชุดของไลบรารีอยู่ที่ด้านบนของลำดับชั้น:

  1. API
  2. ห้องสมุด
  3. แพ็คเกจ
  4. โมดูล
  5. สคริปต์

ดังนั้น API จะประกอบด้วย 2-5 ทั้งหมด?


3
Python ใช้คำว่า "package" และ "library" ไม่มากนัก (นอกเหนือจาก Standard Library)
John Zwinck

คำตอบ:


79

จากบทช่วยสอน Python - โมดูล

  • โมดูล :

    โมดูลคือไฟล์ที่มีคำจำกัดความและคำสั่ง Python ชื่อไฟล์คือชื่อโมดูลที่มีคำต่อท้ายต่อ.pyท้าย

  • แพ็คเกจ :

    แพ็กเกจเป็นวิธีการจัดโครงสร้างเนมสเปซโมดูลของ Python โดยใช้“ dotted module names”

หากคุณอ่านเอกสารประกอบimportคำสั่งให้รายละเอียดเพิ่มเติมตัวอย่างเช่น:

Python มีออบเจ็กต์โมดูลเพียงประเภทเดียวและโมดูลทั้งหมดเป็นประเภทนี้ไม่ว่าโมดูลจะถูกนำไปใช้ใน Python, C หรืออย่างอื่นก็ตาม เพื่อช่วยจัดระเบียบโมดูลและจัดเตรียมลำดับชั้นการตั้งชื่อ Python มีแนวคิดเกี่ยวกับแพ็กเกจ

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

สิ่งสำคัญคือต้องจำไว้ว่าแพ็คเกจทั้งหมดเป็นโมดูล แต่ไม่ใช่ทุกโมดูลที่เป็นแพ็คเกจ หรือกล่าวอีกนัยหนึ่งแพคเกจเป็นเพียงโมดูลชนิดพิเศษ โดยเฉพาะโมดูลใด ๆ ที่มี __path__แอตทริบิวต์ถือเป็นแพ็กเกจ

ดังนั้นคำนี้จึงmoduleหมายถึงเอนทิตีเฉพาะ: เป็นคลาสที่มีอินสแตนซ์เป็นmoduleวัตถุที่คุณใช้ในโปรแกรม python นอกจากนี้ยังใช้โดยการเปรียบเทียบเพื่ออ้างถึงไฟล์ในระบบไฟล์ที่ "สร้าง" อินสแตนซ์เหล่านี้

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

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

เมื่อโมดูล / แพ็กเกจ / อย่างอื่นถูก "เผยแพร่" ผู้คนมักเรียกมันว่าไลบรารี บ่อยครั้งที่ไลบรารีมีแพ็คเกจหรือแพ็คเกจที่เกี่ยวข้องหลายชุด แต่อาจเป็นโมดูลเดียวก็ได้

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

API อาจมีความหมายที่แตกต่างกันขึ้นอยู่กับบริบท ตัวอย่างเช่น:

  • มันสามารถกำหนดโปรโตคอลเช่นที่DB APIหรือบัฟเฟอร์โปรโตคอล
  • สามารถกำหนดวิธีการโต้ตอบกับแอปพลิเคชัน (เช่นPython/C API)
  • เมื่อเกี่ยวข้องกับไลบรารี / แพ็กเกจมันเป็นเพียงอินเทอร์เฟซที่จัดเตรียมโดยไลบรารีนั้นสำหรับการทำงาน (ชุดของฟังก์ชัน / คลาส / ค่าคงที่ ฯลฯ )

ไม่ว่าในกรณีใด API ไม่ใช่รหัสหลาม เป็นคำอธิบายที่อาจเป็นทางการไม่มากก็น้อย


40

เฉพาะแพ็กเกจและโมดูลเท่านั้นที่มีความหมายเฉพาะสำหรับ Python

  1. APIไม่ได้เป็นคอลเลกชันของรหัสต่อ se - มันเป็นเหมือน "โปรโตคอล" สเปคว่าชิ้นส่วน (ปกติห้องสมุด) ต่าง ๆ สื่อสารกัน มี API "มาตรฐาน" ที่น่าสังเกตสองสามรายการใน python เช่นDB API

  2. ในความคิดของฉันห้องสมุดเป็นอะไรที่ไม่ได้เป็นแอพลิเคชัน - ในหลามห้องสมุดเป็นโมดูล - มักจะมีsubmodules ขอบเขตของไลบรารีค่อนข้างแปรปรวนตัวอย่างเช่นไลบรารีมาตรฐาน pythonนั้นกว้างใหญ่ (มีโมดูลย่อยค่อนข้างน้อย) ในขณะที่มีไลบรารีวัตถุประสงค์เดียวจำนวนมากใน PyPi เช่นbackport collections.OrderedDictสำหรับ py <2.7

  3. แพคเกจคือชุดของโมดูลหลามภายใต้ namespace ที่พบบ่อย ในทางปฏิบัติหนึ่งถูกสร้างขึ้นโดยการวางโมดูล python หลายตัวในไดเร็กทอรีด้วย__init__.pyโมดูลพิเศษ(ไฟล์)

  4. โมดูลเป็นไฟล์เดียวของรหัสหลามที่มีความหมายที่จะนำเข้า นี่เป็นการทำให้ง่ายขึ้นเล็กน้อยเนื่องจากในทางปฏิบัติมีโมดูลไม่กี่โมดูลที่ตรวจพบเมื่อเรียกใช้เป็นสคริปต์และทำสิ่งพิเศษในกรณีนั้น

  5. สคริปต์เป็นไฟล์เดียวของรหัสหลามที่มีความหมายที่จะดำเนินการเป็นโปรแกรมหลัก

  6. หากคุณมีชุดรหัสที่ครอบคลุมไฟล์หลายไฟล์คุณอาจมีแอปพลิเคชันแทนสคริปต์


1

ห้องสมุด:เป็นชุดของโมดูล

(ไลบรารีมีโมดูลในตัว (เขียนด้วย C) + โมดูลที่เขียนด้วย python)

โมดูล:ชุดของชิ้นส่วนมาตรฐานหรือหน่วยอิสระแต่ละชุดที่สามารถใช้เพื่อสร้างโครงสร้างที่ซับซ้อนมากขึ้น

การพูดในภาษาที่ไม่เป็นทางการโมดูลคือชุดของโค้ดที่ใช้เพื่อวัตถุประสงค์เฉพาะและสามารถใช้ในโปรแกรมอื่น ๆ ได้เช่นกันเพื่อหลีกเลี่ยงการแห้ง ( D on't R epeat Y ourself) ในฐานะทีมและมุ่งเน้นไปที่ ข้อกำหนดหลัก แหล่งที่มา

APIเป็นอินเทอร์เฟซสำหรับแอปพลิเคชันอื่น ๆ เพื่อโต้ตอบกับไลบรารีของคุณโดยไม่ต้องเข้าถึงโดยตรง

แพคเกจเป็นไดเร็กทอรีที่มีไฟล์

Scriptหมายถึงชุดคำสั่งภายในไฟล์เดียว


0

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

มันอาจจะสับสนและฉันสับสนว่าตัวเองกำลังคิดหนักดังนั้นอย่าไปคิดมากกับมัน อย่างไรก็ตามบริบทมีความสำคัญอย่างยิ่ง

ไลบรารี - ส่วนใหญ่มักจะอ้างถึงไลบรารีทั่วไปหรือคอลเล็กชันอื่นที่สร้างด้วยรูปแบบและการใช้งานที่คล้ายคลึงกัน ห้องสมุดทั่วไปคือผลรวมของโมดูล 'มาตรฐาน' ซึ่งเป็นที่นิยมและใช้กันอย่างแพร่หลายแม่มดสามารถคิดว่าเป็นเครื่องมือไฟล์เดียวในตอนนี้หรือตัดสั้น ๆ เพื่อให้สิ่งต่างๆเป็นไปได้หรือเร็วขึ้น ไลบรารีทั่วไปเป็นตัวเลือกที่คนส่วนใหญ่เปิดใช้เมื่อติดตั้ง Python เนื่องจากมีชื่อนี้ "Python General Library" จึงมักใช้กับโครงสร้างและแนวคิดที่คล้ายคลึงกัน Witch เป็นเพียงแค่การมีโมดูลจำนวนมากบางทีอาจจะรวมแพ็คเกจเข้าด้วยกันโดยปกติจะอยู่ในรายการ รายการมักจะดาวน์โหลดได้ โดยทั่วไปจะเป็นเพียงไฟล์ที่เกี่ยวข้องโดยมีความสนใจคล้ายกัน นั่นเป็นวิธีที่ง่ายที่สุดในการอธิบาย

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

Package - นี่คือคำศัพท์ที่ใช้โดยทั่วไปในบางครั้งแม้ว่าบริบทจะสร้างความแตกต่าง การใช้งานที่พบบ่อยที่สุดจากประสบการณ์ของฉันคือหลายโมดูล (หรือไฟล์) ที่รวมกลุ่มกัน เหตุใดจึงรวมกลุ่มเข้าด้วยกันอาจมีสาเหตุหลายประการนั่นคือเมื่อบริบทมีความสำคัญ นี่คือวิธีที่ฉันสังเกตเห็นแพ็คเกจคำศัพท์ใช้แล้ว เป็นกลุ่มของโมดูลที่ดาวน์โหลดสร้างและ / หรือจัดเก็บไว้ ซึ่งทั้งหมดอาจเป็นจริงหรือเพียง 1 แต่จริงๆแล้วมันเป็นเพียงไฟล์ที่อ้างอิงไฟล์อื่นซึ่งจำเป็นต้องอยู่ในโครงสร้างหรือรูปแบบที่ถูกต้องและผลรวมทั้งหมดนั้นก็คือแพ็กเกจเองติดตั้งหรืออาจรวมอยู่ใน python ห้องสมุดทั่วไป แพ็กเกจสามารถมีโมดูล (ไฟล์. py) ได้เนื่องจากต้องพึ่งพาซึ่งกันและกันและบางครั้งอาจทำงานไม่ถูกต้องหรือเลย มีเป้าหมายร่วมกันของทุกส่วน (โมดูล / ไฟล์) ของแพ็กเกจเสมอและผลรวมของชิ้นส่วนทั้งหมดก็คือแพ็กเกจนั่นเอง

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

ความสับสนส่วนใหญ่มาจากชื่อไฟล์แบบธรรมดาหรือคำนำหน้าไปยังไฟล์โดยใช้เป็นชื่อโมดูลจากนั้นจึงใช้ชื่อแพ็กเกจอีกครั้ง

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

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