Gõ gợi ý vào nametuple


127

Hãy xem xét đoạn mã sau:

from collections import namedtuple
point = namedtuple("Point", ("x:int", "y:int"))

Quy tắc trên chỉ là một cách để chứng minh những gì tôi đang cố gắng đạt được. Tôi muốn thực hiện namedtuplevới các gợi ý loại.

Bạn có biết cách thanh lịch nào để đạt được kết quả như ý không?


2
Ngoài ra, bắt đầu với py3.7 bạn có tùy chọn dataclass: docs.python.org/3/library/dataclasses.html
Johne

Câu trả lời:


151

Cú pháp ưu tiên cho một tuple được nhập có tên từ 3.6 là

from typing import NamedTuple

class Point(NamedTuple):
    x: int
    y: int = 1  # Set default value

Point(3)  # -> Point(x=3, y=1)

Chỉnh sửa Bắt đầu Python 3.7, hãy cân nhắc sử dụng dataclasses(IDE của bạn có thể chưa hỗ trợ chúng để kiểm tra kiểu tĩnh):

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int = 1  # Set default value

Point(3)  # -> Point(x=3, y=1)

12
@JohnE; OP đã đặc biệt yêu cầu các bộ giá trị được đặt tên. Có, nhiều trường hợp sử dụng của các bộ giá trị được đặt tên sẽ được các lớp dữ liệu phục vụ tốt hơn. Tuy nhiên, để trích dẫn tuyệt vời Tại sao không namedtuples : Nếu bạn muốn có một tuple với những cái tên, bằng mọi cách: đi cho một namedtuple
Wolfgang Kuehn

1
Sử dụng dataclasses, nó không thể giải cấu trúc đối tượng kết quả như bạn có thể một tuple
VARAK

6
Một tuple là bất biến. Dataclass không (theo mặc định) Nó có cờ đóng băng gần với hành vi của tuple. Chỉ là một cái gì đó để nhận thức về.
shao.lo

103

Bạn có thể dùng typing.NamedTuple

Từ các tài liệu

Phiên bản đã nhập của namedtuple.

>>> import typing
>>> Point = typing.NamedTuple("Point", [('x', int), ('y', int)])

Điều này chỉ có trong Python 3.5 trở đi


Tôi tuyên bố nó như thế này: GeoPoint = NamedTuple('GeoPoint', [('longitude', float), ('latitude', float)])sau đó tôi cố gắng geo = GeoPoint (** dữ liệu), nơi dữ liệu được dict chứa các phím cần thiết và giá trị là decimal.Decimal, và không có dàn diễn viên để phao xảy ra; (không typerror hoặc :( :( vậy làm thế nào đây typing.NamedTuplecác công trình nhìn thấy? Ý chính .github.com / andilabs / 15002176b2bda786b9037077fa06cc71
andilabs

8
Nhập @andi không thực thi hoặc ép kiểu các biến, afaik.
Bhargav Rao
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.