2013-04-29 32 views
6

Tôi đang viết một ứng dụng bình và tôi thấy rằng mình có rất nhiều chức năng tiện ích chung.Python - Vị trí tốt nhất cho các chức năng chung

Sau đây là các ví dụ về các loại chức năng mà tôi xem xét các chức năng tiện ích chung:

def make_hash(): 
    return defaultdict(make_hash) 

def file_read(filename): 
    with open(file_name_, 'r') as f: 
    return f.read() 

def file_write(filename, data): 
    with open(filename, 'w') as f: 
    f.write(data) 

Tôi đã nghĩ đến việc tung các chức năng này thành một mô-đun riêng biệt tất cả cùng nhau. Tuy nhiên, tôi tò mò nếu tôi có các mối quan tâm sau:

  • Có hai chức năng duy nhất để đảm bảo một mô-đun riêng biệt cùng nhau. tức là các hàm file_read và file_write ở trên có thể đi vào một mô-đun file.py, tuy nhiên kể từ hai hàm của nó, tôi cảm thấy như thế này có thể là quá mức cần thiết.
  • Trong ứng dụng của tôi, tôi sử dụng các chức năng này 2-3 lần cho mỗi chức năng vì vậy tôi di chuyển dưới vỏ bọc họ tạo ra các chức năng tiện ích này sẽ giúp tôi tiết kiệm một số dòng mã, và hy vọng là làm cho tôi hiệu quả hơn.

Câu hỏi: - Điều gì sẽ là cách thức phân nhóm hỗn hợp các chức năng tiện ích chung? Tôi có nên tạo một mô-đun riêng biệt không? Tò mò những gì người khác đang làm để tổ chức loại mã này.

Trả lời

2

Tôi không nghĩ rằng nó có nhiều mối quan hệ với Python, đó là một quyết định thiết kế hơn.

Chỉ với những dòng này, tôi sẽ không tạo mô-đun riêng biệt; tuy nhiên, nếu bạn sử dụng nó 2 đến 3 lần tôi sẽ không sao chép mã. Nếu sau này bạn muốn thay đổi điều gì đó chỉ cần một thay đổi, hãy giữ chức năng nhất quán.

Ngoài ra các phương pháp có vẻ rất chung chung, vì vậy bạn có thể dễ dàng sử dụng chúng trong các dự án khác sau này.

Và tôi giả sử bạn muốn đặt chúng tĩnh (@static_method).

Những gì tôi chủ yếu làm là nhóm các lớp tiện ích chung theo loại, nghĩa là trong trường hợp một tệp cho từ điển (có 1 phương pháp) và một tệp (có 2 phương pháp). Sau đó có thể nhiều phương thức sẽ được thêm nhưng chức năng được nhóm theo loại/mức sử dụng.

+1

Điều này có ý nghĩa. Tôi đã miễn cưỡng để đưa điều này trong một lớp học chỉ vì tôi có (có thể là một không chính xác) khái niệm trước khi thụ thai chỉ tạo ra các lớp học cho các ứng dụng cụ thể các mặt hàng. Tuy nhiên, tôi nghĩ rằng tôi sẽ tạo một kết hợp bằng cách sử dụng giải pháp mà bạn đã cung cấp ở trên .. tức là gói tiện ích với mô-đun/tệp từ điển. Việc nhóm bạn cung cấp ở trên dường như có vẻ phù hợp với tôi và như bạn đã nói, tôi có thể phát triển các mô-đun này khi tôi tạo các hàm chung chung hơn và tôi có thể chuyển các chức năng này xung quanh. Ngoài ra, tôi sẽ rất có thể làm cho những độc lập của ứng dụng. Cảm ơn vì bạn đã phản hồi. – user2152283

+2

Tại sao "các lớp" và "static_methods"? Python không phải là Java, khi tất cả những gì bạn cần là một hàm thì tất cả các phương tiện đều sử dụng một hàm. –

+0

@ user2152283 Có tốt nhất là làm cho ứng dụng độc lập, nó giúp bạn tiết kiệm công việc cho mọi dự án trong tương lai mà bạn đang sử dụng chức năng được tạo. –

0

Trong python, chúng ta có một cái gọi là Package (một thư mục thông thường với một tập tin rỗng gọi là __init__.py) được sử dụng để chứa tất cả các mô-đun của bạn theo cách này.

ứng dụng của bạn có thể truy cập vào không gian tên riêng của nó bằng cách sử dụng.

ví dụ có những file sau

MyPackage/__init__.py (empty) 
MyPackage/webapp.py (your web application) 
MyPackage/utils.py (generic utilities) 

và trong webapp.py bạn có thể có một cái gì đó như thế này

from .utils import * 

hoặc liệt kê từng cái một

from .utils import file_read, file_write 

chú ý vào tiền tố dấu chấm trước utils

+4

nhập * thường được coi là hành vi xấu – Kiro

+0

@Kiro, nói chung bạn nói đúng, nhưng trong trường hợp cụ thể đó là ok, bởi vì utils.py đó là nơi anh ấy sẽ đặt chức năng chung như phiên bản của tệp php_get_contents của php. nếu bạn có liên quan, bạn có thể xác định '' '__all__''' –

+0

Cảm ơn bạn đã phản hồi này. Đây là một câu trả lời tuyệt vời, và tôi dự định sử dụng một biến thể của giải pháp này. – user2152283

0

Có một số việc bạn có thể làm để giảm số lượng tệp mô-đun trong khi vẫn giữ phân loại phụ của các mô-đun của bạn .. Tạo các chức năng mô-đun đa cấp: myModule.Hash.<> myModule.FileIO. <>

Bằng cách này bạn có thể nhập các thành phần riêng lẻ theo ý thích của mình.

+0

Cảm ơn bạn đã phản hồi. Tôi cũng đã đánh dấu đây là câu trả lời có thể chấp nhận được, chỉ cần đánh dấu câu trả lời ở trên là câu trả lời được chấp nhận vì đó là câu trả lời đầu tiên. Cảm ơn bạn! – user2152283

Các vấn đề liên quan