พิมพ์คำแนะนำด้วยคลาสที่ผู้ใช้กำหนด


122

ดูเหมือนจะหาคำตอบที่ชัดเจนไม่ได้ CustomClass()ฉันต้องการจะทำคำใบ้ประเภทสำหรับฟังก์ชั่นและชนิดเป็นชั้นเองบางอย่างที่ผมได้กำหนดเรียกมันว่า

แล้วสมมติว่าในบางฟังก์ชันเรียกมันว่าFuncA(arg)ฉันมีอาร์กิวเมนต์ชื่อargหนึ่ง วิธีที่ถูกต้องในการพิมพ์คำใบ้FuncAคือ:

def FuncA(arg: CustomClass):

หรือจะเป็น:

def FuncA(Arg:Type[CustomClass]):เหรอ?

คำตอบ:


150

อดีตถูกต้องถ้าargยอมรับตัวอย่างของCustomClass :

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

ในกรณีที่คุณต้องการคลาสCustomClassเอง (หรือประเภทย่อย)คุณควรเขียน:

from typing import Type  # you have to import Type

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

เหมือนที่เขียนไว้ในเอกสารเกี่ยวกับการพิมพ์ :

class typing.Type(Generic[CT_co])

ตัวแปรกำกับด้วยอาจยอมรับค่าของชนิดC Cในทางตรงกันข้ามตัวแปรกำกับด้วยType[C]อาจยอมรับค่าที่ตัวเองเรียน - โดยเฉพาะอย่างยิ่งจะยอมรับวัตถุชั้นของC

เอกสารประกอบมีตัวอย่างของintคลาส:

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

1
คือTypeจาก py3.6 และเกิน? ฉันเพิ่งได้รับNameError.
cs95

3
โปรดทราบว่าหากคุณมีคลาสในไฟล์เดียวกันคลาสนั้นจะต้องมีอยู่ในเวลาที่มีการประเมินคำใบ้ประเภท ...
576i

14
@ 576i: iirc คุณยังสามารถใช้สตริง ดังนั้นจึงdef foo(bar: 'Qux')เทียบเท่ากับdef foo(bar: Qux)ยกเว้นว่าไม่จำเป็นต้องโหลดประเภททันที
Willem Van Onsem

2
@willem ขอบคุณ - ฉันไม่รู้ว่า สิ่งที่ดีที่สุดการเติมข้อความอัตโนมัติแบบ pycharm ยังคงใช้งานได้ ..
576i

3
@ cs95 ครับ คำใบ้ประเภททั้งหมดคือ +3.7
thiras
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.