Pertanyaan sesungguhnya adalah kelengkapan. Apakah fungsi pemrosesan file Anda adalah pemrosesan file yang lengkap, atau hanya sepotong dalam rangkaian langkah pemrosesan? Jika sudah lengkap dan dengan sendirinya, maka merasa bebas untuk merangkum semua akses file dalam suatu fungsi.
def ver(filepath):
with open(filepath, "r") as f:
# do processing steps on f
return result
Ini memiliki properti yang sangat bagus untuk menyelesaikan sumber daya (menutup file) di akhir with
pernyataan.
Namun jika ada kemungkinan untuk memproses file yang sudah terbuka, maka perbedaan Anda ver_1
dan ver_2
lebih masuk akal. Sebagai contoh:
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)
Semacam ini pengujian tipe eksplisit sering disukai , terutama dalam bahasa seperti Java, Julia, dan Go mana jenis-atau pengiriman berbasis antarmuka langsung didukung. Namun, dalam Python, tidak ada dukungan bahasa untuk pengiriman berbasis tipe. Terkadang Anda mungkin melihat kritik pengujian tipe langsung dalam Python, tetapi dalam praktiknya itu sangat umum dan cukup efektif. Ini memungkinkan suatu fungsi memiliki tingkat umum yang tinggi, menangani tipe data apa pun yang mungkin muncul, alias "mengetik bebek." Perhatikan garis bawah utama aktif _ver_file
; itu adalah cara konvensional untuk menetapkan fungsi (atau metode) "pribadi". Meskipun secara teknis dapat dipanggil langsung, itu menunjukkan bahwa fungsi tidak dimaksudkan untuk konsumsi eksternal langsung.
Pembaruan 2019: Diberikan pembaruan terbaru dalam Python 3, misalnya jalur sekarang berpotensi disimpan sebagai pathlib.Path
objek bukan hanya str
atau bytes
(3,4+), dan tipe yang mengisyaratkan telah berubah dari esoterik menjadi arus utama (sekitar 3,6+, meskipun masih aktif berkembang), inilah kode yang diperbarui yang memperhitungkan kemajuan ini:
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
dapat digunakan dalam hal ini.