Có một câu lệnh với các câu lệnh hỗ trợ kiểu gợi ý?


16

Bạn có thể xác định gợi ý loại cho một biến được xác định bằng withcú pháp không?

with example() as x:
    print(x)

Tôi muốn gõ gợi ý ở trên để nói rằng đó xlà một str(ví dụ).

Công việc duy nhất mà tôi tìm thấy là sử dụng một biến trung gian, nhưng điều này cảm thấy khó khăn.

with example() as x:
    y: str = x
    print(y)

Tôi không thể tìm thấy một ví dụ trong tài liệu đánh máy .


6
Người kiểm tra loại không nên có thể suy ra loại xnhư là loại trả về example().__enter__()?
pschill

2
Tại sao bạn muốn chú thích xkhi nó chỉ đơn giản là kiểu trả về example.__enter__? Lý tưởng nhất là bạn đã chú thích phương thức / chức năng đó.
a_guest

1
xkhông phải là giá trị trả về của example; đó là giá trị trả về của example().__enter__().
chepner

Hầu hết các phương pháp tôi đã tìm thấy không xác định một gợi ý loại cho giá trị trả về.
Phản ứng

1
@Reactgular Sau đó, giải pháp là tạo một tệp sơ khai cho hàm đó, vì vậy trình kiểm tra kiểu có thể suy ra kiểu. Thông thường bạn chú thích ở ranh giới API, không phải bên trong. Trong trường hợp này, nó rõ ràng loại đến từ example. Chú thích example.__enter__có nghĩa là một chú thích trong khi với cách tiếp cận của bạn, bạn sẽ phải chú thích ở tất cả những nơi sử dụng trình quản lý bối cảnh đó, cộng với việc người dùng phải biết loại trả về của API như thế nào nếu nó không được cung cấp?
a_guest

Câu trả lời:


11

PEP 526, đã được triển khai trong Python 3.6, cho phép bạn chú thích các biến. Bạn có thể sử dụng, ví dụ,

x: str
with example() as x:
    [...]

hoặc là

with example() as x:
    x: str
    [...]

Điều này cũng hoạt động cho các khối mã khác như for. Câu trả lời tuyệt vời, cảm ơn bạn.
Phản ứng

Nếu trình quản lý bối cảnh không gợi ý __enter__phương thức nào sẽ trả về, việc gõ xkhông phục vụ mục đích nào. mypysẽ vui vẻ cho phép một giá trị của bất kỳ loại nào bị ràng buộc x.
chepner

@chepner Có bạn đúng. PyCharm nhận ra xnhư strtrong cả hai trường hợp, nhưng mypykhông.
pschill

14

Thông thường các chú thích loại được đặt ở ranh giới API. Trong trường hợp này, loại nên được suy ra example.__enter__. Trong trường hợp hàm đó không khai báo bất kỳ loại nào, giải pháp là tạo một tệp sơ khai tương ứng để giúp trình kiểm tra loại suy ra loại đó.

Cụ thể, điều này có nghĩa là tạo một .pyitệp có cùng gốc với mô-đun Exampleđược nhập. Sau đó, mã sau đây có thể được thêm vào:

class Example:
    def __enter__(self) -> str: ...
    def __exit__(self, exc_type, exc_value, exc_traceback) -> None: ...
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.