Nhập gợi ý với các lớp do người dùng xác định


103

Dường như không thể tìm ra câu trả lời dứt khoát. Tôi muốn thực hiện một gợi ý kiểu cho một hàm và kiểu là một số lớp tùy chỉnh mà tôi đã xác định, được gọi là nó CustomClass().

Và sau đó giả sử trong một số hàm, hãy gọi nó FuncA(arg), tôi có một đối số được đặt tên arg. Cách chính xác để nhập gợi ý FuncAcó phải là:

def FuncA(arg: CustomClass):

Hoặc nó sẽ là:

def FuncA(Arg:Type[CustomClass]):?

Câu trả lời:


125

Trước là đúng , nếu argchấp nhận một phiên bản củaCustomClass :

def FuncA(arg: CustomClass):
    #     ^ instance of CustomClass

Trong trường hợp bạn muốn chính lớp CustomClass(hoặc một kiểu con) , thì bạn nên viết:

from typing import Type  # you have to import Type

def FuncA(arg: Type[CustomClass]):
    #     ^ CustomClass (class object) itself

Giống như nó được viết trong tài liệu về Đánh máy :

class typing.Type(Generic[CT_co])

Một biến được chú thích bằng Ccó thể chấp nhận một giá trị của kiểu C. Ngược lại, một biến được chú thích với Type[C]có thể chấp nhận các giá trị là chính các lớp - cụ thể, nó sẽ chấp nhận đối tượng lớp củaC .

Tài liệu bao gồm một ví dụ với intlớp:

a = 3         # Has type 'int'
b = int       # Has type 'Type[int]'
c = type(a)   # Also has type 'Type[int]'

1
Typetừ py3.6 trở lên? Tôi chỉ nhận được một NameError.
cs95

3
Lưu ý rằng nếu bạn có các lớp trong cùng một tập tin, nó cần phải tồn tại đồng thời các loại gợi ý được đánh giá ...
576i

13
@ 576i: iirc, bạn cũng có thể sử dụng một chuỗi. Vì vậy, def foo(bar: 'Qux')tương đương với def foo(bar: Qux)ngoại trừ rằng nó không yêu cầu tải loại ngay lập tức.
Willem Van Onsem

2
@willem cảm ơn - Tôi không biết điều đó. Điều tốt nhất, tính năng tự động hoàn thành pycharm vẫn hoạt động ..
576i

3
@ cs95 Có. Tất cả các gợi ý loại là +3,7.
thiras
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.