- Python में आम तौर पर कम ज्ञात 14 उन्नत सुविधियों को वास्तविक उदाहरणों के साथ प्रस्तुत किया गया है
typing, generics, protocols, context managers आदि के माध्यम से static typing और structural design पर गहन व्याख्या दी गई है
- Python 3.10+ में जोड़े गए structural pattern matching और slots, metaclasses जैसी performance optimization तकनीकें भी शामिल हैं
f-string, cache, future, proxy, for-else, walrus आदि जैसे साफ-सुथरा कोड लिखने के टिप्स भी संकलित हैं
- हर सुविधा के लिए अतिरिक्त सीखने के लिंक और संदर्भ सामग्री दी गई है, इसलिए junior developers भी इसे आसानी से समझ सकते हैं
Python की 14 उन्नत सुविधाओं का सार
# typing overload
@overload decorator एक ही function के लिए कई type signatures परिभाषित करने देता है
- type checker दिए गए arguments के आधार पर return type का सटीक अनुमान लगा सकता है
Literal का उपयोग कर string values को सीमित भी किया जा सकता है
id या username में से सिर्फ एक को आवश्यक मानने वाला function signature भी बनाया जा सकता है
- type safety के लिए हल्के Enum विकल्प के रूप में
Literal का उपयोग किया जा सकता है
# keyword-only / positional-only arguments
* का उपयोग करने पर इसे keyword-only argument बनाया जा सकता है (positional argument के रूप में उपयोग नहीं)
/ का उपयोग करने पर इसे positional-only argument बनाया जा सकता है (keyword argument के रूप में उपयोग नहीं)
- API design में arguments के उपयोग के तरीके को स्पष्ट रूप से लागू किया जा सकता है
# future annotations (__future__)
- type hints सामान्यतः runtime पर तुरंत evaluate होते हैं, इसलिए declaration order से जुड़ी समस्या हो सकती है
from __future__ import annotations से evaluation को बाद के लिए टाला जा सकता है
- लेकिन यह string processing तरीके पर आधारित है, इसलिए runtime में type उपयोग करते समय सावधानी चाहिए
PEP 649 में __annotations__ attribute के लिए deferred evaluation पद्धति का सुधार प्रस्तावित है
# generic syntax
- Python 3.12 से नई generic type definition syntax समर्थित है
TypeVar की जगह class Foo[T, U: int] जैसे रूप में इसे अधिक सहज तरीके से लिखा जा सकता है
- variadic generics भी जोड़े गए हैं, जिससे विभिन्न प्रकारों को संभाला जा सकता है
- type alias परिभाषा भी सरल हो गई है, जैसे
type Vector = list[float]
# protocols
- Duck Typing के type-checking संस्करण के रूप में structural subtyping लागू की जा सकती है
- यदि किसी class में कुछ विशेष methods हैं, तो type inheritance के बिना भी type compatibility संभव है
@runtime_checkable के साथ इसे isinstance जाँच तक विस्तारित किया जा सकता है
# context manager
__enter__, __exit__ methods वाले object को with block में उपयोग किया जाता है
contextlib.contextmanager decorator से सरल function-आधारित implementation संभव है
yield के पहले और बाद में setup और cleanup कार्य किए जा सकते हैं
# structural pattern matching
match-case syntax के जरिए जटिल data structures को सहज रूप से branch किया जा सकता है
- tuple/list destructuring, OR pattern, guard condition (
if), wildcard आदि का उपयोग संभव है
- data की संरचना के आधार पर branch होने से readability और maintainability बेहतर होती है
# slots optimization
__dict__ की जगह fixed slots का उपयोग कर memory और speed optimization की जा सकती है
__slots__ में केवल attribute names वाली tuple का उपयोग होता है
- class में अनावश्यक attributes जुड़ने से रोका जा सकता है
- हालांकि यह micro-optimization स्तर की चीज़ है, इसलिए उपयोग सोच-समझकर करना चाहिए
# Python code style tips
- for-else statement: यदि loop
break के बिना समाप्त हो जाए, तो else चलता है
- walrus operator (
:=): variable assignment और condition check एक साथ संभव
- or short-circuit evaluation: कई values में से पहली truthy value लौटाता है
- comparison operator chaining:
0 < x < 10 जैसे रूप में कोड संक्षिप्त किया जा सकता है
# f-string advanced formatting
f"{변수=}" syntax से debugging के लिए expression display किया जा सकता है
- number formats (
:.2f, :+.2f, :,), date formats (%Y-%m-%d) आदि कई विकल्प उपलब्ध हैं
- center alignment, padding, percentage display जैसी format mini-language का उपयोग किया जा सकता है
# cache decorator
@lru_cache और @cache से function results को store करके performance बढ़ाई जा सकती है
- recursive functions या बार-बार होने वाली calculations में यह उपयोगी है
@cache Python 3.9 से जोड़ा गया, और यह default unlimited cache देता है
# Python Future
- JS के Promise जैसा asynchronous object handling फीचर
Future.set_result(), add_done_callback() आदि से result को asynchronously manage किया जा सकता है
asyncio.Future() को await के साथ उपयोग किया जा सकता है
ThreadPoolExecutor के साथ उपयोग करने पर background parallel processing भी संभव है
# proxy property
- किसी class attribute को property की तरह भी और function की तरह भी काम करने देता है
__get__, __call__, __repr__ के जरिए दोनों तरह की कार्यक्षमता दी जा सकती है
- API design में default value और parameterized call को एक ही तरीके से संभालना संभव होता है
- व्यावहारिक उपयोग से अधिक, यह एक प्रयोगात्मक उदाहरण के रूप में देखने योग्य है
# metaclass
- class को बनाने वाली class की class
- class attributes में बदलाव या automatic registration जैसी meta logic लिखी जा सकती है
- व्यवहार में अधिकतर मामलों में इसे decorator से बदला जा सकता है
- Django, SQLAlchemy, Pydantic आदि में अंदरूनी रूप से metaclass का उपयोग होता है
5 टिप्पणियां
बैकएंड के नज़रिए से, metaclasses ने debugging को मुश्किल बनाने का अनुभव दिया है।
ध्यान रखें कि
for-elseको अक्सर anti-pattern माना जाता है, क्योंकि इसे readability या clarity के लिहाज़ से बहुत अच्छा नहीं समझा जाता, औरasyncio.Futureकोasyncioके internal implementation detail के रूप में देखा जाता है।धन्यवाद। खासकर 10वां मैं अभी तुरंत लागू कर रहा हूँ.
AI coding rules भी जोड़ दिए..
बेहतरीन टिप के लिए धन्यवाद
Hacker News राय
नमस्ते! मैं इस ब्लॉग का मूल लेखक हूँ! सुबह 4 बजे यह देखकर चौंक गया कि मेरा लेख HN के पहले पेज पर पहुँच गया
हर बार Python इस्तेमाल करते हुए चिंता होती है कि कहीं मेरा code ऐसा तो नहीं लग रहा जैसे Python का गलत इस्तेमाल किया गया हो
Python को Python ही रहना चाहिए, और golang, Rust, Typescript को अपनी-अपनी philosophy और design के साथ रहना चाहिए
Python की सबसे बड़ी ताकत यह है कि यह executable pseudocode जैसा महसूस होता है
9.3 वाले paragraph evaluation पर एक टिप्पणी: अगर empty string हो तो evaluation अलग होती है
Javascript/Typescript से Python में आए व्यक्ति के रूप में यह एक उपयोगी resource है
ज़्यादातर features वास्तव में advanced features नहीं हैं
इस सूची में मैं जो बदलना चाहूँगा वह collections.abc containers को शामिल करना है
यह लेख पढ़ना आनंददायक था