आप Python 3.6 में और PEP 526 वैरिएबल एनोटेशन का उपयोग कर सकते हैं । आप जेनेरिक केlambda
साथ परिणाम को असाइन करने वाले चर का एनोटेट कर सकते हैं :typing.Callable
from typing import Callable
func: Callable[[str, str], int] = lambda var1, var2: var1.index(var2)
यह फ़ंक्शन ऑब्जेक्ट के लिए टाइप की गई जानकारी को स्वयं संलग्न नहीं करता है, केवल उस नामस्थान पर जिसे आपने ऑब्जेक्ट को संग्रहीत किया है, लेकिन यह आमतौर पर आपको टाइपिंग उद्देश्यों के लिए आवश्यक है।
हालाँकि, आप इसके बजाय केवल एक फ़ंक्शन स्टेटमेंट का उपयोग कर सकते हैं; एक ही लाभ है कि एक lambda
प्रस्ताव है कि आप एक बड़ी अभिव्यक्ति के अंदर एक सरल अभिव्यक्ति के लिए एक फ़ंक्शन परिभाषा रख सकते हैं । लेकिन उपरोक्त लैंबडा एक बड़ी अभिव्यक्ति का हिस्सा नहीं है, यह केवल एक असाइनमेंट स्टेटमेंट का हिस्सा है, इसे एक नाम के लिए बाध्य करता है। यह वास्तव में एक def func(var1: str, var2: str): return var1.index(var2)
बयान क्या हासिल होगा।
ध्यान दें कि आप राज्यों के लिए प्रलेखन के रूप में या तो अलग से टिप्पणी *args
या **kwargs
तर्क नहीं कर सकते Callable
:
वैकल्पिक या कीवर्ड तर्क को इंगित करने के लिए कोई सिंटैक्स नहीं है; ऐसे फ़ंक्शन प्रकार शायद ही कभी कॉलबैक प्रकार के रूप में उपयोग किए जाते हैं।
एक विधि के साथ पीईपी 544 प्रोटोकॉल पर__call__
यह सीमा लागू नहीं होती है ; इसका उपयोग करें यदि आपको एक स्पष्ट परिभाषा की आवश्यकता है कि क्या तर्क स्वीकार किए जाने चाहिए। आपको Python 3.8 की आवश्यकता है या एक बैकपोर्ट के लिए typing-extensions
प्रोजेक्ट स्थापित करें :
from typing-extensions import Protocol
class SomeCallableConvention(Protocol):
def __call__(var1: str, var2: str, spam: str = "ham") -> int:
...
func: SomeCallableConvention = lambda var1, var2, spam="ham": var1.index(var2) * spam
के लिए lambda
अभिव्यक्ति ही , आप किसी भी एनोटेशन (वाक्य रचना जिस पर पायथन के प्रकार हिंट बनाया गया है) का उपयोग नहीं कर सकते हैं। सिंटैक्स केवल def
फ़ंक्शन स्टेटमेंट के लिए उपलब्ध है ।
से - पीईपी 3107 समारोह एनोटेशन :
लैम्ब्डा का सिंटैक्स एनोटेशन का समर्थन नहीं करता है। पैरामीटर सूची के चारों ओर कोष्ठक की आवश्यकता के आधार पर, लैम्ब्डा के सिंटैक्स को एनोटेशन का समर्थन करने के लिए बदला जा सकता है। हालाँकि यह निर्णय लिया गया कि यह परिवर्तन नहीं किया जाएगा क्योंकि:
- यह एक असंगत परिवर्तन होगा।
- लैम्ब्डा वैसे भी neutered हैं।
- लंबोदर को हमेशा एक फ़ंक्शन में बदला जा सकता है।
आप अभी भी एनोटेशन को सीधे ऑब्जेक्ट में संलग्न कर सकते हैं, function.__annotations__
विशेषता एक लेखन शब्दकोश है:
>>> def func(var1: str, var2: str) -> int:
... return var1.index(var2)
...
>>> func.__annotations__
{'var1': <class 'str'>, 'return': <class 'int'>, 'var2': <class 'str'>}
>>> lfunc = lambda var1, var2: var1.index(var2)
>>> lfunc.__annotations__
{}
>>> lfunc.__annotations__['var1'] = str
>>> lfunc.__annotations__['var2'] = str
>>> lfunc.__annotations__['return'] = int
>>> lfunc.__annotations__
{'var1': <class 'str'>, 'return': <class 'int'>, 'var2': <class 'str'>}
ऐसा नहीं है कि इन जैसे गतिशील एनोटेशन आपकी मदद करने जा रहे हैं, जब आप निश्चित रूप से अपने प्रकार के संकेत पर एक स्थिर विश्लेषक चलाना चाहते थे।