"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > Ython बग्स जिनका हर डेवलपर अभी भी सामना कर रहा है और उन्हें कैसे ठीक करें)

Ython बग्स जिनका हर डेवलपर अभी भी सामना कर रहा है और उन्हें कैसे ठीक करें)

2024-10-31 को प्रकाशित
ब्राउज़ करें:538

ython bugs that every developer is still facing in and how to fix them)

Ritten by रूपेश शर्मा उर्फ ​​@hackyrupesh

पायथन, अपनी सरलता और सुंदरता के साथ, दुनिया की सबसे लोकप्रिय प्रोग्रामिंग भाषाओं में से एक है। हालाँकि, 2024 में भी, कुछ खामियाँ डेवलपर्स को परेशान करती रहेंगी। ये समस्याएँ हमेशा Python की कमज़ोरियों के कारण नहीं होती हैं, बल्कि इसके डिज़ाइन, व्यवहार या सामान्य ग़लतफ़हमियों के कारण होती हैं जिनके परिणामस्वरूप अप्रत्याशित परिणाम होते हैं। इस ब्लॉग लेख में, हम शीर्ष 5 पायथन मुद्दों पर नज़र डालेंगे जिनका सामना प्रत्येक डेवलपर अभी भी 2024 में करेगा, साथ ही उनके समाधान भी।


1. परिवर्तनीय डिफ़ॉल्ट तर्क: एक मूक जाल

समस्या

सबसे कुख्यात पायथन बग्स में से एक म्यूटेबल डिफॉल्ट तर्क है। जब किसी परिवर्तनशील वस्तु (जैसे सूची या शब्दकोश) को किसी फ़ंक्शन में डिफ़ॉल्ट तर्क के रूप में उपयोग किया जाता है, तो फ़ंक्शन परिभाषित होने पर पायथन केवल एक बार इस डिफ़ॉल्ट तर्क का मूल्यांकन करता है, हर बार फ़ंक्शन को कॉल करने पर नहीं। जब फ़ंक्शन ऑब्जेक्ट को संशोधित करता है तो यह अप्रत्याशित व्यवहार की ओर ले जाता है।

उदाहरण

def append_to_list(value, my_list=[]):
    my_list.append(value)
    return my_list

print(append_to_list(1))  # Outputs: [1]
print(append_to_list(2))  # Outputs: [1, 2] - Unexpected!
print(append_to_list(3))  # Outputs: [1, 2, 3] - Even more unexpected!

समाधान

इससे बचने के लिए, डिफ़ॉल्ट तर्क के रूप में कोई नहीं का उपयोग करें और यदि आवश्यक हो तो फ़ंक्शन के अंदर एक नई सूची बनाएं।

def append_to_list(value, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(value)
    return my_list

print(append_to_list(1))  # Outputs: [1]
print(append_to_list(2))  # Outputs: [2]
print(append_to_list(3))  # Outputs: [3]

संदर्भ

  • पायथन का डिफ़ॉल्ट तर्क समझ गया

2. शब्दकोशों में मायावी कुंजी त्रुटि

समस्या

KeyError तब होता है जब किसी ऐसी शब्दकोश कुंजी तक पहुंचने का प्रयास किया जाता है जो मौजूद नहीं है। नेस्टेड शब्दकोशों के साथ काम करते समय या ऐसे डेटा से निपटते समय जिसकी संरचना की गारंटी नहीं है, यह विशेष रूप से मुश्किल हो सकता है।

उदाहरण

data = {'name': 'Alice'}
print(data['age'])  # Raises KeyError: 'age'

समाधान

KeyError को रोकने के लिए, get() विधि का उपयोग करें, जो कुंजी नहीं मिलने पर कोई नहीं (या एक निर्दिष्ट डिफ़ॉल्ट मान) लौटाता है।

print(data.get('age'))  # Outputs: None
print(data.get('age', 'Unknown'))  # Outputs: Unknown

नेस्टेड शब्दकोशों के लिए, संग्रह मॉड्यूल या डॉटमैप या पायडैश जैसी लाइब्रेरी से डिफॉल्टडिक्ट का उपयोग करने पर विचार करें।

from collections import defaultdict

nested_data = defaultdict(lambda: 'Unknown')
nested_data['name'] = 'Alice'
print(nested_data['age'])  # Outputs: Unknown

संदर्भ

  • पायथन कुंजीत्रुटि और इसे कैसे संभालें

3. अति प्रयोग को छोड़कर प्रयास के साथ मौन त्रुटियां

समस्या

ट्राई-एक्सेप्ट ब्लॉक का अति प्रयोग या दुरुपयोग करने से मूक त्रुटियां हो सकती हैं, जहां अपवाद पकड़े जाते हैं लेकिन ठीक से नियंत्रित नहीं किए जाते हैं। इससे बग का पता लगाना और डीबग करना मुश्किल हो सकता है।

उदाहरण

try:
    result = 1 / 0
except:
    pass  # Silently ignores the error
print("Continuing execution...")

उपरोक्त उदाहरण में, ZeroDivisionError को पकड़ लिया गया है और अनदेखा कर दिया गया है, लेकिन यह अंतर्निहित समस्या को छुपा सकता है।

समाधान

हमेशा उस अपवाद प्रकार को निर्दिष्ट करें जिसे आप पकड़ रहे हैं, और इसे उचित रूप से संभालें। त्रुटि लॉग करने से समस्याओं को ट्रैक करने में भी मदद मिल सकती है।

try:
    result = 1 / 0
except ZeroDivisionError as e:
    print(f"Error: {e}")
print("Continuing execution...")

व्यापक अपवाद प्रबंधन के लिए, आप पास के बजाय लॉगिंग का उपयोग कर सकते हैं:

import logging

try:
    result = 1 / 0
except Exception as e:
    logging.error(f"Unexpected error: {e}")

संदर्भ

  • पायथन की कोशिश-सर्वोत्तम प्रथाओं को छोड़कर

4. पूर्णांक प्रभाग: ट्रंकेशन का जाल

समस्या

पायथन 3 से पहले, दो पूर्णांकों का विभाजन डिफ़ॉल्ट रूप से फ़्लोर डिवीजन करता था, जिससे परिणाम एक पूर्णांक में छोटा हो जाता था। हालाँकि पायथन 3 ने इसे ट्रू डिवीज़न (/) के साथ हल किया, कुछ डेवलपर्स को अभी भी समस्याओं का सामना करना पड़ता है जब वे अनजाने में फ़्लोर डिवीज़न (//) का उपयोग करते हैं।

उदाहरण

print(5 / 2)  # Outputs: 2.5 in Python 3, but would be 2 in Python 2
print(5 // 2)  # Outputs: 2

समाधान

विभाजन के लिए हमेशा / का उपयोग करें जब तक कि आपको विशेष रूप से फर्श विभाजन की आवश्यकता न हो। Python 2 से Python 3 में कोड पोर्ट करते समय सावधान रहें।

print(5 / 2)  # Outputs: 2.5
print(5 // 2)  # Outputs: 2

स्पष्ट और पूर्वानुमेय कोड के लिए, अधिक सटीक अंकगणितीय परिचालनों के लिए दशमलव.दशमलव का उपयोग करने पर विचार करें, विशेष रूप से वित्तीय गणना में।

from decimal import Decimal

print(Decimal('5') / Decimal('2'))  # Outputs: 2.5

संदर्भ

  • पायथन डिवीजन: / बनाम //

5. सर्कुलर संदर्भों के साथ मेमोरी लीक

समस्या

पायथन का कचरा संग्रहकर्ता अधिकांश मेमोरी प्रबंधन को संभालता है, लेकिन सर्कुलर संदर्भों को अगर सही तरीके से नहीं संभाला गया तो मेमोरी लीक हो सकता है। जब दो या दो से अधिक ऑब्जेक्ट एक-दूसरे को संदर्भित करते हैं, तो वे कभी भी कचरा एकत्र नहीं कर सकते हैं, जिससे मेमोरी उपयोग बढ़ जाता है।

उदाहरण

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.next = node1  # Circular reference

del node1
del node2  # Memory not freed due to circular reference

समाधान

सर्कुलर संदर्भों से बचने के लिए, वीकरेफ मॉड्यूल के माध्यम से कमजोर संदर्भों का उपयोग करने पर विचार करें, जो कोई मजबूत संदर्भ मौजूद नहीं होने पर संदर्भों को कचरा एकत्र करने की अनुमति देता है।

import weakref

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

node1 = Node(1)
node2 = Node(2)
node1.next = weakref.ref(node2)
node2.next = weakref.ref(node1)  # No circular reference now

वैकल्पिक रूप से, आप ऑब्जेक्ट को हटाने से पहले किसी भी संदर्भ को सेट करके मैन्युअल रूप से चक्र को तोड़ सकते हैं।

node1.next = None
node2.next = None
del node1
del node2  # Memory is freed

संदर्भ

  • पायथन मेमोरी प्रबंधन और कचरा संग्रहण

निष्कर्ष

2024 में भी, पायथन डेवलपर्स को इन सामान्य बग का सामना करना जारी रहेगा। हालाँकि पिछले कुछ वर्षों में भाषा विकसित और बेहतर हुई है, लेकिन ये मुद्दे अक्सर पायथन के काम करने के बुनियादी पहलुओं से जुड़े होते हैं। इन कमियों को समझकर और उचित समाधान लागू करके, आप अधिक मजबूत, त्रुटि रहित कोड लिख सकते हैं। हैप्पी कोडिंग!


रूपेश शर्मा उर्फ ​​@hackyrupesh द्वारा लिखित

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/hackyrupesh/5-python-bugs-that-every-developer-is-still-facing-in-2024-and-how-to-fix-them-5f4p? 1 क्योंकि यदि कोई उल्लंघन है, तो कृपया उसे हटाने के लिए [email protected] से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3