Belirtilen türden bir listeye ipucu veren yazın


130

Python 3'ün fonksiyon açıklamalarını kullanarak, PyCharm'da ve diğer IDE'lerde tip ipucu vermek amacıyla homojen bir liste (veya başka bir koleksiyon) içinde yer alan öğelerin türünü belirtmek mümkündür.

Bir int listesi için sözde python kodu örneği:

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

Docstring kullanılarak mümkün olduğunu biliyorum ...

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

... ama mümkünse ek açıklama stilini tercih ederim.


İşlev açıklamalarında aynı formatı kullanmayı denediniz mi? Ne oldu?
jonrsharpe

@jonrsharpe Bir hata oluşturmalı çünkü type object is not subscriptableişlevi tanımlarken. Açıkçası bir dizge kullanabilirsiniz: def my_func(L: 'list[int]')ancak PyCharm'ın dokümanları ayrıştırırken onu ayrıştırıp ayrıştırmayacağını bilmiyorum ...
Bakuriu

@Bakuriu evet, 'list[int]'net değilse özür dilerim demek istedim .
jonrsharpe

PyCharm'ın onu docstrings gibi ayrıştıracağı görünmüyor.
Eric W.

Yanıtlar:


161

Kendi sorumu cevaplamak; TLDR yanıtı Hayır Evet .

Güncelleme 2

Eylül 2015'te Python 3.5, Type İpuçları desteği ile piyasaya sürüldü ve yeni bir yazma modülü içeriyor . Bu, koleksiyonlarda bulunan türlerin belirtilmesine izin verir. Kasım 2015 itibariyle, JetBrains PyCharm 5.0, aşağıda gösterildiği gibi Tip İpuçlarını dahil etmek için Python 3.5'i tam olarak desteklemektedir.

Tür İpuçlarını Kullanarak PyCharm 5.0 Kod Tamamlama

Güncelleme 1

Mayıs 2015 itibariyle, PEP0484 (Tip İpuçları) resmi olarak kabul edilmiştir. Taslak uygulama, github'da ambv / typehinting altında da mevcuttur .

Orijinal Cevap

Ağustos 2014 itibariyle, koleksiyonlardaki türleri belirtmek için Python 3 türü ek açıklamalarını kullanmanın mümkün olmadığını doğruladım (örneğin: dizelerin listesi).

ReStructuredText veya Sphinx gibi biçimlendirilmiş doküman dizilerinin kullanımı uygun alternatiflerdir ve çeşitli IDE'ler tarafından desteklenir.

Ayrıca Guido'nun, tür ek açıklamalarını mypy ruhu içinde genişletme fikri üzerinde düşündüğü görülüyor: http://mail.python.org/pipermail/python-ideas/2014-August/028618.html


Güncelleme: Görünüşe göre, genel türler için destek içerecek tür ipuçlarının PEP484 python.org/dev/peps/pep-0484
Eric

75

Artık Python 3.5 resmi olarak piyasaya sürüldüğüne göre, Destekleyici Tip İpuçları var - typingve ilgiliList genel kapsayıcılar için "tip".

Başka bir deyişle, şimdi şunları yapabilirsiniz:

from typing import List

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

10

PEP 484'ten beri yazı tipi yorumları eklendi

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()}]

Bu şu anda benim için Python 3.6.4 ile PyCharm üzerinde çalışıyor

Pycharm'da Örnek Resim


4

BDFL'nin desteğiyle, python'un (muhtemelen 3.5) işlev ek açıklamaları aracılığıyla tip ipuçları için standart bir sözdizimi sağlayacağı neredeyse kesin.

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

PEP'de belirtildiği gibi, bu standardı zaten kullanan ve herhangi bir yeni sözdizimi gerektirmeyen mypy adında deneysel bir tür denetleyici (bir tür pilint gibi, ancak türler için) vardır.

http://mypy-lang.org/


3

Python 3.9'dan itibaren, yerleşik türler tür ek açıklamalarına göre geneldir (bkz. PEP 585 ). Bu, öğelerin türünü doğrudan belirlemeye izin verir:

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

Python 3.9'dan önceki bu sözdizimini çeşitli araçlar destekleyebilir. Çalışma zamanında ek açıklamalar incelenmediğinde, sözdizimi tırnak işareti veya kullanılarak geçerlidir __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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.