2016-02-05 20 views
20

Trong PEP 484, nhập gợi ý đã được thêm vào Python 3 với sự bao gồm của mô-đun typing. Có cách nào để làm điều này trong Python 2? Tất cả tôi có thể nghĩ là có một trang trí để thêm vào các phương pháp để kiểm tra các loại, nhưng điều này sẽ thất bại trong thời gian chạy và không được bắt sớm hơn như gợi ý sẽ cho phép.Gợi ý loại bằng Python 2

Trả lời

28

Theo Suggested syntax for Python 2.7 and straddling code trong PEP 484 xác định loại gợi ý, có một cú pháp thay thế cho khả năng tương thích với Python 2.7. Tuy nhiên nó không bắt buộc vì vậy tôi không biết nó được hỗ trợ tốt như thế nào, nhưng trích dẫn PEP:

Một số công cụ có thể muốn hỗ trợ chú thích loại trong mã phải tương thích với Python 2.7. Với mục đích này, PEP có phần mở rộng được đề xuất (nhưng không bắt buộc), trong đó chú thích hàm được đặt trong một loại #: chú thích. Bình luận như vậy phải được đặt ngay sau tiêu đề hàm (trước chuỗi docstring). Một ví dụ: sau Python 3 mã:

def embezzle(self, account: str, funds: int = 1000000, *fake_receipts: str) -> None: 
    """Embezzle funds from account using fake receipts.""" 
    <code goes here> 

tương đương như sau:

def embezzle(self, account, funds=1000000, *fake_receipts): 
    # type: (str, int, *str) -> None 
    """Embezzle funds from account using fake receipts.""" 
    <code goes here> 

Đối mypy hỗ trợ, xem Type checking Python 2 code.

+0

Hmm ok, nên đã đọc các tài liệu hơn nữa. Bạn có biết nếu có bất kỳ công cụ nào hiện hỗ trợ điều này không? Không chắc chắn nếu nó chỉ là một tiêu chuẩn hoặc nếu có thực tế dụng cụ thực hiện được nêu ra. – Andrew

+0

Theo PyCharm "PyCharm hỗ trợ loại gợi ý trong chú thích hàm và nhập nhận xét bằng cách sử dụng mô-đun nhập được xác định bởi PEP 484." Tham chiếu đến các Ý KIẾN TYPE làm cho nó rõ ràng rằng nó cần được hỗ trợ. Tôi không sử dụng pyCharm trên máy tính này vì vậy tôi không thể kiểm tra nó ngay bây giờ. CHỈNH SỬA: liên kết tới pycharm: https://www.jetbrains.com/pycharm/help/type-hinting-in-pycharm.html#d316912e110 – Mijamo

+0

Cảm ơn, cũng thấy rằng Emacs Jedi cũng làm việc với nó. – Andrew

8

Tại thời điểm này cách tương thích đề nghị và python3 làm là đi theo python2 tới 3 hướng: http://python-future.org/func_annotations.html

def embezzle(self, account: str, funds: int = 1000000, *fake_receipts: str) -> None: 
    """Embezzle funds from account using fake receipts.""" 
    pass 

Trở thành:

def embezzle(self, account, funds = 1000000, *fake_receipts): 
    """Embezzle funds from account using fake receipts.""" 
    pass 
embezzle.__annotations__ = {'account': str, 'funds': int, 'fake_receipts': str, 'return': None} 
Các vấn đề liên quan