คำถามจริงเป็นหนึ่งในความสมบูรณ์ ฟังก์ชั่นการประมวลผลไฟล์ของคุณเป็นการประมวลผลที่สมบูรณ์ของไฟล์หรือเป็นเพียงส่วนเดียวในขั้นตอนการประมวลผลหรือไม่? ถ้ามันเสร็จสมบูรณ์และเป็นของตัวเองแล้วคุณสามารถห่อหุ้มการเข้าถึงไฟล์ทั้งหมดภายในฟังก์ชั่น
def ver(filepath):
with open(filepath, "r") as f:
# do processing steps on f
return result
นี่คือคุณสมบัติที่ดีมากของการจบทรัพยากร (ปิดไฟล์) ในตอนท้ายของwith
คำสั่ง
อย่างไรก็ตามหากมีความจำเป็นต้องประมวลผลไฟล์ที่เปิดอยู่แล้วความแตกต่างของคุณver_1
และver_2
สมเหตุสมผลมากขึ้น ตัวอย่างเช่น:
def _ver_file(f):
# do processing steps on f
return result
def ver(fileobj):
if isinstance(fileobj, str):
with open(fileobj, 'r') as f:
return _ver_file(f)
else:
return _ver_file(fileobj)
ชนิดของการทดสอบประเภทอย่างชัดเจนมักจะขมวดคิ้วโดยเฉพาะอย่างยิ่งในภาษาเช่น Java, จูเลียและไปที่ TYPE- หรือเยี่ยงอย่างอินเตอร์เฟซที่ใช้สนับสนุนโดยตรง อย่างไรก็ตามใน Python ไม่มีภาษาที่รองรับสำหรับการแจกจ่ายตามประเภท คุณอาจเห็นคำวิจารณ์ของการทดสอบโดยตรงใน Python เป็นครั้งคราว แต่ในทางปฏิบัติมันเป็นเรื่องธรรมดาและมีประสิทธิภาพมาก มันช่วยให้ฟังก์ชั่นมีระดับสูงโดยทั่วไปการจัดการประเภทข้อมูลใดก็ตามที่มีแนวโน้มว่าจะเกิดขึ้นหรือที่เรียกว่า "การพิมพ์เป็ด" สังเกตการขีดเส้นใต้นำบน_ver_file
; นั่นเป็นวิธีดั้งเดิมในการกำหนดฟังก์ชั่น "ส่วนตัว" (หรือวิธีการ) แม้ว่าจะสามารถเรียกใช้เทคนิคได้โดยตรง แต่ก็แสดงให้เห็นว่าฟังก์ชั่นไม่ได้มีไว้สำหรับการบริโภคภายนอกโดยตรง
การอัปเดต 2019: จากการอัพเดทล่าสุดใน Python 3 ตัวอย่างเช่นตอนนี้พา ธ นั้นอาจถูกจัดเก็บเป็นpathlib.Path
วัตถุไม่ใช่str
หรือbytes
(3.4+) และการบอกกล่าวแบบนั้นได้หายไปจากความลึกลับไปสู่กระแสหลัก (ประมาณ 3.6+ รหัสที่อัปเดตซึ่งนำความก้าวหน้าเหล่านี้มาพิจารณา:
from pathlib import Path
from typing import IO, Any, AnyStr, Union
Pathish = Union[AnyStr, Path] # in lieu of yet-unimplemented PEP 519
FileSpec = Union[IO, Pathish]
def _ver_file(f: IO) -> Any:
"Process file f"
...
return result
def ver(fileobj: FileSpec) -> Any:
"Process file (or file path) f"
if isinstance(fileobj, (str, bytes, Path)):
with open(fileobj, 'r') as f:
return _ver_file(f)
else:
return _ver_file(fileobj)
your_function
สามารถใช้ในการนี้