2013-04-06 31 views
48

Trong python 3 Tôi có thể tạo đối số và trả về các chú thích kiểu. Ví dụ:đặt lớp hiện tại làm chú thích kiểu trả về

class Graph: 
    def __init__(self, V: int, E: int, edges: list): 
     pass 

    @classmethod 
    def fromfile(cls, readobj: type(sys.stdin)): 
     pass 

    def V(self) -> int: 
     pass 

    def E(self) -> int: 
     pass 

Vấn đề là tôi không thể tạo chú thích với kiểu trả về của lớp hiện tại (Đồ thị) chưa được xác định. Ví dụ:

class Graph: 
    def reverse(self) -> Graph: 
     pass 

Mã này đi với lỗi

def reverse(self) -> Graph: 
NameError: name 'Graph' is not defined 

Những chú thích này là thực sự hữu ích cho cả tài liệu và cho phép các IDE để nhận ra lý lẽ và kiểu trả về => enable autocomplete

UPD: Vì vậy, những gì tôi đưa ra là điều này hoặc là không thể hoặc yêu cầu một số hacks tôi không thích, vì vậy tôi quyết định sử dụng chỉ def reverse (self) -> 'Graph': đó là dễ hiểu cho documenta mặc dù phá vỡ quy tắc. Nhược điểm là nó không hoạt động cho IDE autocomplete.

+0

Bạn đã thử: 'def reverse (self) -> type (self)' – Ankur

+0

có thể trùng lặp của [Tại sao tên của lớp chứa không được nhận dạng là chú thích hàm trả về giá trị?] (Http: // stackoverflow. com/questions/15741887/why-is-the-name-of-the-contains-class-not-recogn-as-a-return-value-functio) – eryksun

+2

Bản sao có thể có của [Làm cách nào để xác định loại trả về một phương thức giống như chính lớp đó trong python?] (https://stackoverflow.com/questions/33533148/how-do-i-specify-that-the-return-type-of-a-method-is- –

Trả lời

29

Vì vậy, bây giờ sau một thời gian tôi có thể nói rằng quyết định tôi đã sử dụng là -> 'Graph' thay vì -> Graph. Nó không làm cho IDE của tôi (PyCharm) có thể nhận ra một kiểu theo cách này, nhưng nó chỉ hoạt động đủ tốt cho các mục đích tài liệu.

Một giải pháp khả thi tôi có thể sử dụng được thay đổi chú thích trong thời gian chạy nhưng điều đó không giải quyết vấn đề với tài liệu hướng dẫn - bạn sẽ không muốn tìm kiếm khai báo kiểu ở đâu đó ở giữa nguồn ...

Các vấn đề có nguồn gốc trong việc nhận diện đối tượng lớp trước khi lớp thực sự được định nghĩa. Điều đó đơn giản là không thể làm trong python.

+19

Trên thực tế, đây là giải pháp đúng cho một vấn đề được gọi là tham khảo về phía trước - https://www.python.org/dev/peps/pep-0484/#forward-references . Và phiên bản hiện tại của PyCharm (trong thời gian viết bình luận này) nhận ra một lỗi đánh máy được viết và cung cấp tất cả sự hỗ trợ cần thiết. –

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