2013-06-13 32 views
11

Tôi có tình huống sau: Tôi đang làm việc trên một số dự án sử dụng các mô-đun thư viện mà tôi đã viết. Các mô-đun thư viện chứa một số lớp và chức năng. Trong mỗi dự án, một số tập con của mã của các thư viện được sử dụng.Có công cụ nào xóa các chức năng không được sử dụng trong Python không?

Tuy nhiên, khi tôi xuất bản dự án cho người dùng khác, tôi chỉ muốn cung cấp mã được sử dụng bởi dự án đó chứ không phải toàn bộ mô-đun. Điều này có nghĩa là tôi muốn, đối với một dự án cụ thể, để xóa các hàm thư viện không sử dụng khỏi mã thư viện (tức là tạo một thư viện mới giảm). Có công cụ nào có thể thực hiện điều này tự động không?

EDIT

Một số làm rõ/trả lời:

  1. Về "bạn không nên làm điều này nói chung" trả lời: Điểm mấu chốt là trong thực tế, trước khi tôi xuất bản một dự án, tôi tự đi qua các mô-đun thư viện và xóa mã không sử dụng. Vì chúng tôi là tất cả các lập trình viên, chúng tôi biết rằng không có lý do gì để làm điều gì đó theo cách thủ công khi bạn có thể dễ dàng giải thích cho một máy tính cách thực hiện điều đó. Vì vậy, thực tế, viết một chương trình như vậy là có thể và thậm chí không nên quá khó khăn (có, nó có thể không phải là siêu chung). Câu hỏi của tôi là nếu ai đó biết liệu một công cụ như vậy tồn tại, trước khi tôi bắt đầu suy nghĩ về việc thực hiện nó một mình. Ngoài ra, bất kỳ suy nghĩ nào về việc thực hiện điều này đều được hoan nghênh.
  2. Tôi không muốn chỉ đơn giản là ẩn tất cả mã của mình. Nếu tôi muốn làm điều đó, tôi có lẽ sẽ không sử dụng Python. Trong thực tế, tôi muốn xuất bản mã nguồn, nhưng chỉ có mã có liên quan đến dự án được đề cập.
  3. Về các nhận xét "bạn được bảo vệ về mặt pháp lý": Trong trường hợp cụ thể của tôi, việc bảo vệ pháp lý/giấy phép không giúp tôi. Ngoài ra, vấn đề ở đây là chung chung hơn so với một số ăn cắp mã. Ví dụ, nó có thể là vì lợi ích của sự rõ ràng: nếu ai đó cần phải sử dụng/phát triển mã, bạn không muốn hàng chục chức năng không liên quan được bao gồm.
+1

Tôi tự hỏi (chân thành) tại sao đây không phải là thực tế phổ biến với các thư viện python (hoặc không python) khác. Có lẽ nó mang lại nhiều vấn đề hơn là giải quyết (hoặc không cần thiết). – heltonbiker

+16

Lưu ý rằng điều này hầu như không thể làm một cách chính xác nói chung: Không có cách nào bạn có thể dự đoán các chức năng nào có thể được truy cập thông qua các tính năng động như 'getattr'. – delnan

+5

Cuối cùng, một mô-đun/thư viện phải là tập hợp các hàm/lớp làm việc cùng nhau để hoàn thành một mục tiêu duy nhất. Nếu một số chức năng không bao giờ được sử dụng, sau đó nó làm cho bạn tự hỏi nếu họ thực sự cần phải là một phần của cùng một thư viện/mô-đun. – mgilson

Trả lời

3

Lời khuyên đầu tiên của tôi là thiết kế mã của bạn với mô đun mạnh hơn để bạn có thể có tất cả các chức năng của mình muốn giữ nhiều mô-đun python/trứng như bạn phải làm cho nó linh hoạt để có chỉ là những gì bạn cần cho mỗi dự án của bạn. Và tôi nghĩ rằng đó sẽ là cách duy nhất để giữ cho mã của bạn dễ dàng quản lý và dễ đọc.

Điều đó nói rằng, nếu bạn thực sự muốn đi theo cách bạn mô tả trong câu hỏi của bạn, với kiến ​​thức của tôi không có công cụ làm chính xác những gì bạn nói, bởi vì nó là một mẫu sử dụng phổ biến.

Nhưng tôi không nghĩ rằng khó có thể mã hóa công cụ thực hiện bằng cách sử dụng rope. Nó phân tích mã tĩnh và động (vì vậy bạn có thể tìm thấy những đối tượng được nhập khẩu đang được sử dụng, vì vậy hãy đoán những gì không được sử dụng từ các mô-đun đã nhập của bạn), và cũng cung cấp nhiều công cụ tái cấu trúc để di chuyển hoặc loại bỏ mã. Dù sao, tôi nghĩ rằng để có thể thực sự tạo ra một công cụ tìm kiếm chính xác tất cả mã đang được sử dụng trong mã hiện tại của bạn, bạn cần phải thực hiện kiểm tra đơn vị đầy đủ mã của bạn hoặc bạn sẽ thực sự có phương pháp như thế nào bạn nhập mã của mô-đun của bạn (chỉ sử dụng from foo import bar và tránh nhập chuỗi giữa các mô-đun).

0

Nếu mục đích của bạn là không cung cấp mã, thì chỉ cần phân phối thư viện biên dịch python, chứ không phải mã nguồn cho nó. Không cần phải thực hiện các cuộc gọi mã theo cách thủ công, chỉ cần phân phối các phiên bản pyc của các tệp của bạn. Nếu bạn sợ rằng mọi người sẽ lấy mã của bạn và không cung cấp cho bạn tín dụng, đừng cho họ mã nếu có thay thế.

Điều đó nói rằng, chúng tôi có giấy phép vì lý do. Bạn đặt tiêu đề tối thiểu và thuộc tính của bạn ở đầu mỗi tệp và bạn phân phối tệp LICENSE với phần mềm của bạn cho biết rõ ràng mọi người là gì và không được phép làm với mã nguồn của bạn. Nếu họ vi phạm điều đó, và bạn bắt được chúng, bây giờ bạn đã có quyền truy đòi hợp pháp. NẾU bạn không tin tưởng mọi người để duy trì giấy phép đó: đó là toàn bộ lý do nó ở đó. Nếu mã của bạn quá độc đáo đến nỗi nó cần phải được cấp phép vì sợ những người khác bỏ qua nó như là của riêng họ, nó sẽ dễ dàng tìm thấy những vi phạm. Tuy nhiên, nếu bạn đối xử với tất cả các mã của bạn như thế này, một kiểm tra thực tế nhỏ: bạn không phải là tốt. Hầu như không có gì bạn viết sẽ là bản gốc đủ mà những người khác cũng đã không viết nó, cố gắng bám vào nó sẽ không có lợi cho bạn, hoặc bất cứ ai khác.

Bảo vệ mã tốt nhất? Dán nó trực tuyến cho mọi người xem, để bạn có thể chỉ mọi người khác vào nó và đi "thấy? Đó là mã của tôi. Và cái giật này đang sử dụng nó trong sản phẩm của riêng họ mà không cho tôi tín dụng". Bảo vệ mã kém hơn, nhưng vẫn bảo vệ: không phân phối mã, phân phối các thư viện đã biên dịch.(Mã bảo vệ tồi tệ nhất: phân phối mã gimped vì bạn sợ thế giới vì những lý do sai)

+2

Hãy lưu ý rằng các tệp '.pyc' có thể, theo mặc định, được biên dịch một cách trivially – sapi

+0

Tất nhiên, lưu ý rằng điều này đúng với hầu hết tất cả các mã được biên dịch. Nhưng ai đó cần phải được khá địa ngục-cong về ăn cắp mã của bạn để dịch ngược nó, thay vì chỉ "vít nó, tôi sẽ chỉ sử dụng khác, đúng mã nguồn mở thư viện mà làm điều tương tự" =) –

+1

Tình hình thực sự là nhiều hơn phức tạp. Tôi * muốn * muốn đưa ra mã của dự án mà tôi xuất bản. Tôi không muốn đưa ra mã không liên quan đến dự án. – Bitwise

2

Tôi đồng ý với @zmo - một cách để tránh các vấn đề trong tương lai như thế này là lên kế hoạch trước và làm cho mã của bạn trở thành mô-đun càng tốt. Tôi đã đề nghị đưa các lớp và chức năng vào các tệp nhỏ hơn nhiều. Điều này có nghĩa là đối với mọi dự án bạn thực hiện, bạn sẽ phải chọn thủ công những tệp nhỏ hơn này để bao gồm. Tôi không chắc liệu điều đó có khả thi với quy mô dự án của bạn ngay bây giờ hay không. Nhưng đối với các dự án tương lai, đó là một thực tế bạn có thể xem xét.

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