Python की उन्नत सुविधाएँ
(blog.edward-li.com)- 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
@overloaddecorator एक ही 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 कोwithblock में उपयोग किया जाता हैcontextlib.contextmanagerdecorator से सरल function-आधारित implementation संभव हैyieldके पहले और बाद में setup और cleanup कार्य किए जा सकते हैं
# structural pattern matching
match-casesyntax के जरिए जटिल 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 में यह उपयोगी है
@cachePython 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 को शामिल करना है
यह लेख पढ़ना आनंददायक था