2017-01-25 23 views
5

Tôi đang cố gắng triển khai Nút và Cạnh cho biểu đồ. Đây là mã của tôi:Loại đệ quy lẫn nhau trong Python 3.6, sử dụng cú pháp tuple có tên

from typing import NamedTuple, List 

class Node(NamedTuple): 
    name: str 
    edges: List[Edge] 

class Edge(NamedTuple): 
    src: Node 
    dest: Node 

Điều này đặt ra một lỗi vì kiểu Edge không được định nghĩa khi Node được tạo ra.

NameError: name 'Edge' is not defined 

Switching các định nghĩa xung quanh không làm việc vì Edge cũng đề cập đến Node.

Tôi làm cách nào để nó hoạt động?

Trả lời

5

Bạn có thể sử dụng chuỗi ký tự; họ sẽ được đánh giá sau:

class Node(NamedTuple): 
    name: str 
    edges: List['Edge'] 

Xem Forward References section của PEP 484 - Loại Gợi ý:

Khi một loại gợi ý chứa tên chưa được định nghĩa nào, định nghĩa có thể được diễn tả như một chuỗi chữ, để được giải quyết sau.

Đối NamedTuple vật, tài liệu tham khảo về phía trước được lưu trữ một cách rõ ràng cho sau này dereferencing:

>>> Node._field_types 
{'name': <class 'str'>, 'edges': typing.List[_ForwardRef('Edge')]} 

mà một kiểm tra kiểu có thể sau dereference từ người dân địa phương và globals:

>>> typing._eval_type(Node._field_types['edges'], globals(), locals()) 
typing.List[__main__.Edge] 
6

Sử dụng chuỗi literals.

from typing import NamedTuple, List 

class Node(NamedTuple): 
    name: str 
    edges: List['Edge'] 

class Edge(NamedTuple): 
    src: Node 
    dest: Node 

Các chi tiết có trong PEP-484, dưới sự "Forward Tham khảo":

Khi một loại gợi ý chứa tên chưa được định nghĩa nào, định nghĩa có thể được diễn tả như một chuỗi chữ, để được giải quyết sau.

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