Câu hỏi thực sự là một trong những đầy đủ. Là chức năng xử lý tệp của bạn là xử lý hoàn chỉnh tệp, hay chỉ là một phần trong chuỗi các bước xử lý? Nếu nó hoàn thành và tự nó, thì hãy đóng gói tất cả quyền truy cập tệp trong một hàm.
def ver(filepath):
with open(filepath, "r") as f:
# do processing steps on f
return result
Điều này có thuộc tính rất hay là hoàn thiện tài nguyên (đóng tệp) vào cuối with
câu lệnh.
Tuy nhiên, nếu có thể cần xử lý một tệp đã mở, thì việc phân biệt của bạn ver_1
và ver_2
có ý nghĩa hơn. Ví dụ:
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)
Đây là loại thử nghiệm loại rõ ràng thường được tán thành , đặc biệt là trong các ngôn ngữ như Java, Julia, và Go nơi loại- hoặc điều phối giao diện dựa trên được hỗ trợ trực tiếp. Tuy nhiên, trong Python, không có hỗ trợ ngôn ngữ nào cho việc gửi dựa trên kiểu. Thỉnh thoảng bạn có thể thấy những lời chỉ trích về kiểm tra kiểu trực tiếp trong Python, nhưng trong thực tế, nó cực kỳ phổ biến và khá hiệu quả. Nó cho phép một hàm có mức độ tổng quát cao, xử lý bất kỳ kiểu dữ liệu nào có khả năng đi theo cách của nó, còn gọi là "gõ vịt". Lưu ý gạch dưới hàng đầu trên _ver_file
; đó là một cách thông thường để chỉ định một chức năng (hoặc phương thức) riêng tư. Mặc dù về mặt kỹ thuật có thể được gọi trực tiếp, nó cho thấy chức năng này không dành cho tiêu dùng bên ngoài trực tiếp.
Cập nhật 2019: Đưa ra các bản cập nhật gần đây trong Python 3, ví dụ: các đường dẫn hiện có khả năng được lưu trữ dưới dạng pathlib.Path
các đối tượng không chỉ str
hoặc bytes
(3.4+) và gợi ý kiểu đó đã chuyển từ bí truyền sang chính thống (khoảng 3.6+, mặc dù vẫn đang tích cực phát triển), đây mã cập nhật đưa những tiến bộ này vào tài khoản:
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
có thể được sử dụng trong vấn đề này.