Ketik yang mengisyaratkan daftar dari jenis tertentu


130

Menggunakan anotasi fungsi Python 3, dimungkinkan untuk menentukan jenis item yang terdapat dalam daftar homogen (atau koleksi lain) untuk tujuan jenis yang mengisyaratkan di PyCharm dan IDE lainnya?

Contoh kode pseudo-python untuk daftar int:

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

Saya tahu itu mungkin menggunakan Docstring ...

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

... tapi saya lebih suka gaya anotasi jika memungkinkan.


Sudahkah Anda mencoba menggunakan format yang sama dalam anotasi fungsi? Apa yang terjadi?
jonrsharpe

@jonrsharpe Ini harus menimbulkan kesalahan karena type object is not subscriptablesaat mendefinisikan fungsi. Jelas Anda dapat menggunakan string: def my_func(L: 'list[int]')tetapi saya tidak tahu apakah PyCharm akan menguraikannya saat mengurai dokumen ...
Bakuriu

@ Bakuriu ya, maksud saya 'list[int]', maaf jika itu tidak jelas.
jonrsharpe

Tampaknya PyCharm tidak akan menguraikannya seperti halnya docstrings.
Eric W.

Jawaban:


161

Menjawab pertanyaan saya sendiri; jawaban TLDR adalah Tidak Ya .

Perbarui 2

Pada September 2015, Python 3.5 dirilis dengan dukungan untuk Type Hints dan menyertakan modul pengetikan baru . Ini memungkinkan spesifikasi jenis yang terdapat dalam koleksi. Mulai November 2015, JetBrains PyCharm 5.0 mendukung penuh Python 3.5 untuk menyertakan Petunjuk Jenis seperti yang diilustrasikan di bawah ini.

Penyelesaian Kode PyCharm 5.0 menggunakan Petunjuk Jenis

Perbarui 1

Mulai Mei 2015, PEP0484 (Type Hints) telah diterima secara resmi. Implementasi draf juga tersedia di github di bawah ambv / typehinting .

Jawaban Asli

Pada Agustus 2014, saya telah mengonfirmasi bahwa tidak mungkin menggunakan anotasi jenis Python 3 untuk menentukan jenis dalam koleksi (mis: daftar string).

Penggunaan dokumen yang diformat seperti reStructuredText atau Sphinx adalah alternatif yang layak dan didukung oleh berbagai IDE.

Tampaknya Guido juga mempertimbangkan gagasan memperluas anotasi tipe dalam semangat mypy: http://mail.python.org/pipermail/python-ideas/2014-August/028618.html


Pembaruan: Tampaknya tipe yang mengisyaratkan untuk menyertakan dukungan untuk tipe generik telah sampai ke PEP484 python.org/dev/peps/pep-0484
Eric W.

75

Sekarang Python 3.5 secara resmi keluar, ada modul pendukung Type Hints - typingdan List"type" yang relevan untuk wadah generik.

Dengan kata lain, sekarang Anda dapat melakukan:

from typing import List

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

10

Jenis komentar telah ditambahkan sejak 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()}]

Ini saat ini berfungsi untuk saya di PyCharm dengan Python 3.6.4

Contoh Gambar di Pycharm


4

Dengan dukungan dari BDFL, hampir pasti sekarang bahwa python (mungkin 3.5) akan menyediakan sintaks standar untuk petunjuk tipe melalui anotasi fungsi.

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

Seperti yang direferensikan di PEP, ada pemeriksa tipe eksperimental (sejenis pylint, tetapi untuk tipe) yang disebut mypy yang sudah menggunakan standar ini, dan tidak memerlukan sintaks baru.

http://mypy-lang.org/


3

Pada Python 3.9, tipe bawaan bersifat umum sehubungan dengan anotasi tipe (lihat PEP 585 ). Ini memungkinkan untuk secara langsung menentukan jenis elemen:

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

Berbagai alat mungkin mendukung sintaks ini lebih awal dari Python 3.9. Jika anotasi tidak diinspeksi pada waktu proses, sintaksnya valid menggunakan kutipan atau __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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.