2009-04-29 23 views
47

Có điều gì đó tương tự như Pylint, mà sẽ xem xét một kịch bản Python (hoặc chạy nó), và xác định phiên bản của Python mỗi dòng (hoặc chức năng) yêu cầu?Công cụ để xác định phiên bản Python thấp nhất được yêu cầu?

Ví dụ, việc sử dụng lý thuyết:

$ magic_tool <EOF 
with something: 
    pass 
EOF 
1: 'with' statement requires Python 2.6 or greater 

$ magic_tool <EOF 
class Something: 
    @classmethod 
    def blah(cls): 
     pass 
EOF 
2: classmethod requires Python 2.2 or greater 
$ magic_tool <EOF 
print """Test 
""" 
EOF 
1: Triple-quote requires Python 1.5 of later 

Là một điều như vậy có thể? Tôi cho rằng cách đơn giản nhất là có tất cả các phiên bản Python trên đĩa, chạy tập lệnh với từng cái và xem lỗi nào xảy ra.

+3

+1 Đây là một câu hỏi hay. Tôi đã tìm kiếm một cái gì đó như thế này gần đây. – Zifre

+0

Chắc chắn là có thể. Tuy nhiên, nó vẫn chưa được triển khai. – lothar

+4

Câu hỏi hay. Việc chạy một dự án lớn trong phiên bản tiếp theo của Python sẽ không dứt khoát, trừ khi bạn đã có các bài kiểm tra đơn vị kỳ diệu đạt được phạm vi mã 100%, vì vậy một công cụ như thế này sẽ rất hay. –

Trả lời

42

Lấy cảm hứng từ câu hỏi tuyệt vời này, gần đây tôi đã đặt cùng một tập lệnh cố gắng thực hiện việc này. Bạn có thể tìm thấy nó trên github tại pyqver.

Hoàn toàn hợp lý nhưng có một số khía cạnh chưa được xử lý (như đã đề cập trong tệp README). Cảm thấy tự do để ngã ba và cải thiện nó!

8

Không phải là câu trả lời hữu ích thực tế nhưng ở đây nó vẫn hoạt động. Tôi nghĩ rằng điều này nên có thể thực hiện được (mặc dù có thể là một bài tập khá), ví dụ bạn có thể đảm bảo rằng bạn có tất cả các ngữ pháp chính thức cho các phiên bản bạn muốn kiểm tra, như this one.

Sau đó phân tích cú pháp mã bắt đầu bằng phiên bản ngữ pháp đầu tiên. Tiếp theo bạn cần một bản đồ tương tự của tất cả các không gian tên mô-đun tích hợp và phân tích lại mã bắt đầu với phiên bản sớm nhất, mặc dù có thể khó phân biệt giữa các mô-đun và mô-đun tích hợp bên ngoài hoặc cái gì đó ở giữa như ElementTree.

Kết quả phải là tổng quan về các phiên bản hỗ trợ cú pháp của mã và tổng quan về các mô-đun và phiên bản nào (nếu cần) là cần thiết để sử dụng. Với kết quả đó, bạn có thể tính toán phiên bản thấp nhất và cao nhất tốt nhất.

+1

+1 Đối với các trường đại học, hãy thử một công việc như thế này, và cho nhận xét của bạn về những khó khăn trong việc hoàn thành điều này bằng cách sử dụng ví dụ về ElementTree. Câu hỏi này khá nhiều gợi ý về phân tích tĩnh, rất khó để đạt được cho các ngôn ngữ động như bạn chỉ ra. Với việc thỉnh thoảng Python sử dụng "từ __future__ import blah", nó thậm chí còn khó hơn. Và sau đó ném vào gõ vịt :-) Yours là một câu trả lời tốt mà giới thiệu tất cả những con giun trong có thể. –

+0

Hãy xem câu trả lời mới của tôi cho câu hỏi này, tôi đặt cùng một tập lệnh cố gắng xác định phiên bản Python tối thiểu được yêu cầu. –

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