एक निर्दिष्ट प्रकार की एक सूची संकेत टाइप करें


128

पायथन 3 के फ़ंक्शन एनोटेशन का उपयोग करते हुए, PyCharm और अन्य IDEs में टाइप करने के उद्देश्य से एक सजातीय सूची (या अन्य संग्रह) के भीतर निहित वस्तुओं के प्रकार को निर्दिष्ट करना संभव है?

इंट की सूची के लिए एक छद्म-पायथन कोड उदाहरण:

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

मुझे पता है कि यह Docstring का उपयोग करना संभव है ...

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

... लेकिन अगर यह संभव है तो मैं एनोटेशन शैली पसंद करता हूं।


क्या आपने फ़ंक्शन एनोटेशन में समान प्रारूप का उपयोग करने की कोशिश की है? क्या हुआ?
जोनरशेप

@jonrsharpe type object is not subscriptableफ़ंक्शन को परिभाषित करते समय यह एक त्रुटि पैदा करनी चाहिए । स्पष्ट रूप से आप एक स्ट्रिंग का उपयोग कर सकते हैं: def my_func(L: 'list[int]')लेकिन मुझे नहीं पता कि क्या PyCharm इसे पार्स करेगा क्योंकि यह डॉकस्ट्रिंग्स को पार्स करता है ...
बाकूरी

@ बकुरीउ हां, मेरा मतलब था 'list[int]', माफी अगर यह स्पष्ट नहीं था।
jonrsharpe

ऐसा प्रतीत नहीं होता है कि PyCharm इसे पार्स करेगा जैसे यह डॉकस्ट्रिंग्स करता है।
एरिक डब्ल्यू।

जवाबों:


161

मेरे अपने प्रश्न का उत्तर देना; TLDR का उत्तर हां नहीं है

अपडेट २

सितंबर 2015 में, Python 3.5 को टाइप संकेत के समर्थन के साथ जारी किया गया था और इसमें एक नया टाइपिंग मॉड्यूल शामिल है । यह संग्रह के भीतर निहित प्रकारों के विनिर्देशन के लिए अनुमति देता है। नवंबर 2015 तक, JetBrains PyCharm 5.0 नीचे दिए गए उदाहरण के अनुसार टाइप संकेत शामिल करने के लिए Python 3.5 का पूरी तरह से समर्थन करता है।

PyCharm 5.0 कोड टाइप संकेत का उपयोग कर समापन

अपडेट १

मई 2015 तक, PEP0484 (टाइप संकेत) को औपचारिक रूप से स्वीकार कर लिया गया है। ड्राफ़्ट कार्यान्वयन अस्पष्ट / टाइपिंग के तहत जीथब पर भी उपलब्ध है ।

मूल उत्तर

अगस्त 2014 तक, मैंने पुष्टि की है कि संग्रह के भीतर प्रकारों को निर्दिष्ट करने के लिए पायथन 3 प्रकार के एनोटेशन का उपयोग करना संभव नहीं है (उदाहरण: तार की एक सूची)।

पुनर्संरचनात्मक पाठ या स्फिंक्स जैसे स्वरूपित डॉकस्ट्रिंग्स का उपयोग व्यवहार्य विकल्प हैं और विभिन्न आईडीई द्वारा समर्थित हैं।

यह भी प्रतीत होता है कि गुइडो मैपी की भावना में टाइप एनोटेशन का विस्तार करने के विचार से मुल्ला है: http://mail.python.org/pipermail/python-ideas/2014-August/028618.html


अपडेट: ऐसा प्रतीत होता है कि जेनेरिक प्रकारों के लिए समर्थन को शामिल करने के लिए टाइप करने से PEP484 python.org/dev/peps/pep-0484
Eric W.

74

अब जब पायथन 3.5 आधिकारिक तौर पर बाहर हो गया है, तो टाइप हंट्स मॉड्यूल का समर्थन करता है - typingऔर Listजेनेरिक कंटेनरों के लिए प्रासंगिक "प्रकार"।

दूसरे शब्दों में, अब आप यह कर सकते हैं:

from typing import List

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

10

पीईपी 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 के साथ काम कर रहा है

पिक्चर में उदाहरण चित्र


4

BDFL के समर्थन के साथ, यह अब लगभग निश्चित है कि अजगर (शायद 3.5) फ़ंक्शन एनोटेशन के माध्यम से टाइप संकेत के लिए एक मानकीकृत सिंटैक्स प्रदान करेगा।

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

पीईपी में संदर्भित के रूप में, एक प्रायोगिक प्रकार-चेकर (पाइलिंट की तरह, लेकिन प्रकारों के लिए) है जिसे मायपी कहा जाता है जो पहले से ही इस मानक का उपयोग करता है, और किसी नए सिंटैक्स की आवश्यकता नहीं होती है।

http://mypy-lang.org/


3

पायथन 3.9 के रूप में, बिलिन प्रकार एनोटेशन के संबंध में सामान्य हैं ( पीईपी 585 देखें )। यह सीधे तत्वों के प्रकार को निर्दिष्ट करने की अनुमति देता है:

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

विभिन्न उपकरण इस सिंटैक्स का समर्थन पहले पायथन 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.