พิมพ์คำใบ้รายการประเภทที่ระบุ


130

การใช้คำอธิบายประกอบฟังก์ชันของ Python 3 เป็นไปได้ที่จะระบุประเภทของรายการที่อยู่ในรายการที่เป็นเนื้อเดียวกัน (หรือคอลเล็กชันอื่น ๆ ) เพื่อวัตถุประสงค์ในการระบุประเภทใน PyCharm และ IDE อื่น ๆ ?

ตัวอย่างรหัส pseudo-python สำหรับรายการ int:

def my_func(l:list<int>):
    pass

ฉันรู้ว่ามันเป็นไปได้โดยใช้ Docstring ...

def my_func(l):
    """
    :type l: list[int]
    """
    pass

... แต่ฉันชอบรูปแบบคำอธิบายประกอบมากกว่าถ้าเป็นไปได้


คุณได้ลองใช้รูปแบบเดียวกันในคำอธิบายประกอบของฟังก์ชันแล้วหรือยัง? เกิดอะไรขึ้น?
jonrsharpe

@jonrsharpe ควรเพิ่มข้อผิดพลาดเนื่องจากtype object is not subscriptableเมื่อกำหนดฟังก์ชัน เห็นได้ชัดว่าคุณสามารถใช้สตริงได้def my_func(L: 'list[int]')แต่ฉันไม่รู้ว่า PyCharm จะแยกวิเคราะห์หรือไม่ขณะที่มันแยกวิเคราะห์ docstrings ...
Bakuriu

@ บาคุริวใช่ฉันหมายถึง'list[int]'ขอโทษถ้ามันไม่ชัดเจน
jonrsharpe

ไม่ปรากฏว่า PyCharm จะแยกวิเคราะห์เหมือนกับ docstrings
Eric W.

คำตอบ:


161

ตอบคำถามของตัวเอง คำตอบ TLDR คือไม่มี ใช่ใช่

อัปเดต 2

ในเดือนกันยายนปี 2015 Python 3.5 ได้รับการปล่อยตัวด้วยการสนับสนุนคำแนะนำประเภทและรวมถึงใหม่พิมพ์โมดูล สิ่งนี้ช่วยให้สามารถกำหนดประเภทที่มีอยู่ภายในคอลเลกชัน ณ เดือนพฤศจิกายน 2015 JetBrains PyCharm 5.0 รองรับ Python 3.5 อย่างสมบูรณ์เพื่อรวม Type Hints ดังภาพประกอบด้านล่าง

การกรอกรหัส PyCharm 5.0 โดยใช้คำแนะนำประเภท

อัปเดต 1

ในเดือนพฤษภาคม 2015 PEP0484 (คำแนะนำประเภท)ได้รับการยอมรับอย่างเป็นทางการ การใช้งานแบบร่างยังมีอยู่ที่github ภายใต้ ambv / typehintingambv

คำตอบเดิม

เมื่อเดือนสิงหาคม 2014 ฉันยืนยันว่าไม่สามารถใช้คำอธิบายประกอบประเภท Python 3 เพื่อระบุประเภทภายในคอลเลกชันได้ (เช่นรายการสตริง)

การใช้ docstrings ที่จัดรูปแบบเช่น reStructuredText หรือ Sphinx เป็นทางเลือกที่ใช้ได้และได้รับการสนับสนุนโดย IDE ต่างๆ

ดูเหมือนว่า Guido กำลังครุ่นคิดถึงแนวคิดในการขยายคำอธิบายประกอบประเภทด้วยจิตวิญญาณของ mypy: http://mail.python.org/pipermail/python-ideas/2014-August/028618.html


อัปเดต: ดูเหมือนว่าการบอกใบ้ประเภทเพื่อรวมการสนับสนุนประเภททั่วไปได้เข้ามาสู่ PEP484 python.org/dev/peps/pep-0484
Eric W.

75

ตอนนี้ Python 3.5 เปิดตัวอย่างเป็นทางการแล้วมี Type Hints รองรับโมดูล - typingและที่เกี่ยวข้องList "type" ที่สำหรับคอนเทนเนอร์ทั่วไป

กล่าวอีกนัยหนึ่งตอนนี้คุณสามารถทำได้:

from typing import List

def my_func(l: List[int]):
    pass

10

เพิ่มความคิดเห็นประเภทตั้งแต่PEP 484

from . import Monitor
from typing import List, Set, Tuple, Dict


active_monitors = [] # type: List[Monitor]
# or
active_monitors: List[Monitor] = []

# bonus
active_monitors: Set[Monitor] = set()
monitor_pair: Tuple[Monitor, Monitor] = (Monitor(), Monitor())
monitor_dict: Dict[str, Monitor] = {'codename': Monitor()}

# nested
monitor_pair_list: List[Dict[str, Monitor]] = [{'codename': Monitor()}]

ขณะนี้ใช้งานได้กับฉันใน PyCharm ด้วย Python 3.6.4

ตัวอย่างรูปภาพใน Pycharm


4

ด้วยการสนับสนุนจาก BDFL ตอนนี้เกือบจะแน่นอนแล้วว่า python (อาจเป็น 3.5) จะให้ไวยากรณ์มาตรฐานสำหรับคำแนะนำประเภทผ่านคำอธิบายประกอบของฟังก์ชัน

https://www.python.org/dev/peps/pep-0484/

ตามที่อ้างถึงใน PEP มีตัวตรวจสอบประเภททดลอง (ชนิดคล้ายไพลินท์ แต่สำหรับประเภท) ที่เรียกว่า mypy ซึ่งใช้มาตรฐานนี้อยู่แล้วและไม่จำเป็นต้องใช้ไวยากรณ์ใหม่

http://mypy-lang.org/


3

สำหรับ Python 3.9 ประเภทบิวท์อินเป็นประเภททั่วไปสำหรับคำอธิบายประกอบประเภท (ดูPEP 585 ) สิ่งนี้ช่วยให้ระบุประเภทขององค์ประกอบได้โดยตรง:

def my_func(l: list[int]):
    pass

เครื่องมือต่างๆอาจรองรับไวยากรณ์นี้ก่อนหน้า Python 3.9 เมื่อไม่มีการตรวจสอบคำอธิบายประกอบที่รันไทม์ไวยากรณ์จะถูกต้องโดยใช้การอ้างอิงหรือ__future__.annotations.

# quoted
def my_func(l: 'list[int]'):
    pass
# postponed evaluation of annotation
from __future__ import annotations

def my_func(l: list[int]):
    pass
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.