پیتھون: ان جگہوں پر احتیاط برتیں

مصنف:ایلیڈن, تخلیق: 2016-12-29 13:46:12, تازہ کاری:

پیتھون: ان جگہوں پر احتیاط برتیں

python是一门非常有趣的语言。它提供了许多非常方便的标准库和许多内置命令是我们轻松完成任务.但是好东西太多了就有选择恐惧症了,以至于我们不能很好第利用这个标准库和它的基本机构。下面列出了一些对python新手来说很简单有效的陷阱。

  • پائیتھون کے ورژن کو نظر انداز کر دیا

    یہ ایک مسئلہ ہے جو لوگ اسٹیک اوور فلو پر بار بار اٹھاتے ہیں۔ جب آپ کا کامل کوڈ کسی اور کے کمپیوٹر پر چل رہا ہے تو غلطی کا تجربہ کیا جاتا ہے ، لہذا اس وقت آپ کو یہ چیک کرنے کی ضرورت ہے کہ آپ کا پائیتھون ورژن ایک جیسا ہے۔ اس بات کو یقینی بنائیں کہ آپ کا کوڈ پائیتھون کے کسی بھی ورژن پر چل رہا ہے جس کے بارے میں آپ جانتے ہو۔ آپ مندرجہ ذیل کوڈ کے ذریعہ پائیتھون ورژن دیکھ سکتے ہیں:

    $ python --version
    Python 2.7.9
    

    python ورژن مینجمنٹ

    pyenv ایک اچھا python ورژن مینجمنٹ ٹول ہے۔ بدقسمتی سے یہ صرف *nix سسٹم پر چلتا ہے۔ میک OS پر ، آپ آسانی سے brew install pyenv انسٹال کرسکتے ہیں ، اور لینکس سسٹم میں ایک خودکار انسٹالر ہے۔

  • ایک لائن کے ساتھ تمام مسائل کو حل کرنے کے لئے پھنس گیا

    بہت سے لوگ فخر کرتے ہیں کہ میں نے کووی کوڈ کی ایک لائن کے ساتھ تمام مسائل کو حل کیا ہے، یہاں تک کہ اگر ان کا کوڈ عام طور پر لکھا گیا ہے کے مقابلے میں زیادہ غیر موثر ہے، اور یہ کوڈ پڑھنے کے لئے مشکل ہے، یہاں تک کہ مبہم بھی ہے؛ مثال کے طور پر:

    l = [m for a, b in zip(this, that) if b.method(a) != b for m in b if not m.method(a, b) and reduce(lambda x, y: a + y.method(), (m, a, b))]
    

    اگر آپ صرف ایک فہرست یا سیٹ میں کچھ شامل کرکے اپنے آپ کو ایک پیچیدہ مسئلہ حل کرنے کا طریقہ دکھاتے ہیں تو ، آپ کو ممکنہ طور پر کچھ بھی نہیں مل سکتا ہے۔

    ایک سطر کا کوڈ کنٹرول کوئی بڑی کامیابی نہیں ہے، اگرچہ بعض اوقات یہ خاص طور پر ہوشیار نظر آتا ہے۔ اچھا کوڈ سادہ ہے لیکن کارکردگی اور پڑھنے میں آسانی پر زیادہ توجہ دیتا ہے۔

  • سیٹ کو غلط طریقے سے شروع کیا گیا

    这是一个更加微妙的问题,有时候会让你措手不及。set推导式起来有点像list推导式.

    >>> { n for n in range(10) if n % 2 == 0 }
    {0, 8, 2, 4, 6}
    >>> type({ n for n in range(10) if n % 2 == 0 })
    

    مندرجہ بالا مثال اس کی وضاحت کرتی ہے۔ set ایک طرح سے lists in container کی طرح ہے۔ ان میں فرق یہ ہے کہ سیٹ میں کوئی تکرار نہیں ہے اور یہ بے ترتیب ہے۔ لوگ عام طور پر {} کو خالی سیٹ سمجھتے ہیں ، لیکن ایسا نہیں ہے ، یہ ایک خالی ڈکٹ ہے۔

    >>> {}
    {}
    >>> type({})
    

    لہذا اگر ہم ایک خالی سیٹ کو شروع کرنا چاہتے ہیں تو ہم براہ راست سیٹ کا استعمال کرتے ہیں

    >>> set()
    set()
    >>> type(set())
    

    نوٹ کریں کہ ایک خالی سیٹ سیٹ کے طور پر بیان کیا جا سکتا ہے (() ، لیکن ایک ایسے سیٹ کے طور پر بیان کیا جائے گا جس میں عناصر شامل ہیں (([1، 2]) ؛

  • GIL غلط فہمی

    GIL (عالمی تشریح لاک) کا مطلب یہ ہے کہ صرف ایک ہی تھریڈ کسی بھی وقت پائیتھون پروگرام میں چل سکتا ہے۔ اس کا مطلب یہ ہے کہ جب ہم ایک تھریڈ نہیں بناسکتے ہیں اور اس کے متوازی چلانے کی توقع نہیں کرتے ہیں۔ پائیتھون تشریح کرنے والا اصل میں مختلف چلانے والی لائنوں کو تیزی سے تبدیل کرنے کے لئے کرتا ہے۔ لیکن یہ ایک بہت ہی آسان ورژن ہے۔ بہت سی مثالوں میں پروگرام متوازی چلتا ہے ، جیسے کہ جب C توسیع شدہ لائبریری کا استعمال کیا جاتا ہے۔ لیکن جب پائیتھون کوڈ چلتا ہے تو زیادہ تر وقت متوازی طور پر عملدرآمد نہیں ہوتا ہے۔ دوسرے لفظوں میں ، پائیتھون میں تھریڈ جاوا یا سی ++ کی طرح نہیں ہوتا ہے۔

    بہت سے لوگ اس بات کا دفاع کرنے کی کوشش کریں گے کہ یہ تمام حقیقی دھاگے ہیں۔ 3 یہ سچ ہے ، لیکن اس حقیقت کو تبدیل نہیں کرتا ہے کہ پِیٹون دھاگوں کو مختلف طریقے سے سنبھالتا ہے جس کی آپ توقع کرتے ہیں۔ روبی میں بھی اسی طرح کی صورتحال ((اور ایک ترجمان لاک بھی ہے)) ہے۔

    ایک تجویز کردہ حل یہ ہے کہ ملٹی پروسیسنگ ماڈیول کا استعمال کریں۔ ملٹی پروسیسنگ ماڈیول کے ذریعہ فراہم کردہ طریقہ کار بنیادی طور پر اختلافات کو اچھی طرح سے ڈھک سکتے ہیں۔ تاہم ، اختلافات تھریڈ کی قیمت سے کہیں زیادہ ہیں۔ لہذا متوازی کام کرنا ہمیشہ اچھا نہیں ہوتا ہے۔

    تاہم، یہ مسئلہ ہر پطرون پروگرام کے ساتھ نہیں ہوتا ہے۔ PyPy-stm پطرون کا ایک ایسا عمل ہے جو GIL سے متاثر نہیں ہوتا ہے۔ دیگر پلیٹ فارمز جیسے JVM (Jython) یا CLR (IronPython) پر بنائے گئے عمل میں کوئی GIL مسئلہ نہیں ہے۔

    مختصر یہ کہ، تھریڈ کلاس کا استعمال کرتے وقت محتاط رہیں، آپ کو شاید وہ چیز نہیں مل رہی جو آپ چاہتے ہیں۔

  • متروک سٹائل کلاس کا استعمال

    پیتھون 2 میں دو قسم کے کلاسز ہیں، پرانے اور نئے سٹائل کے۔ اگر آپ پیتھون 3 استعمال کر رہے ہیں تو آپ ڈیفالٹ نئے سٹائل کے استعمال کر رہے ہیں۔ اس بات کو یقینی بنانے کے لئے کہ آپ پیتھون 2 میں نئے سٹائل کے استعمال کرتے ہیں، آپ کو آبجیکٹ یا کسی بھی نئی کلاس کی میراث کی ضرورت ہے جو آپ بناتے ہیں جو ہمیشہ اندرونی ہدایت int یا list کی میراث نہیں ہوتی ہے۔ دوسرے الفاظ میں، آپ کی بنیادی کلاس ہمیشہ آبجیکٹ کی میراث ہونی چاہئے۔

    class MyNewObject(object): # stuff here
    

    یہ نئے کلاس ٹائپس کچھ بہت بنیادی مسائل کو ٹھیک کرتے ہیں جو پرانے کلاسوں میں پائے جاتے ہیں۔ اگر آپ دلچسپی رکھتے ہیں تو آپ دستاویزات دیکھ سکتے ہیں۔

  • غلط تکرار

    یہ غلطیاں نئے آنے والوں کے لیے بہت عام ہیں:

    for name_index in range(len(names)):
      print(names[name_index])
    

    یہ واضح ہے کہ لین کا استعمال ضروری نہیں ہے، اور اصل میں یہ ایک بہت ہی سادہ جملے کے ساتھ کیا جا سکتا ہے:

    for name in names:
       print(name)  
    

    اس کے علاوہ، بہت سے دوسرے ٹولز ہیں جو آپ کو ایڈیشن کو آسان بنانے میں مدد کرتے ہیں۔ مثال کے طور پر، زپ کو دو فہرستوں میں منتقل کرنے کے لئے استعمال کیا جا سکتا ہے:

    for cat, dog in zip(cats, dogs):
       print(cat, dog)
    

    اگر ہم انڈیکس اور ویلیو لسٹ متغیرات پر غور کرنا چاہتے ہیں تو ہم انویرٹ استعمال کرسکتے ہیں۔

    for index, cat in enumerate(cats):
       print(cat, index)
    

    اگر آپ کے پاس یہ ٹولز ہیں جو آپ چاہتے ہیں تو اسے استعمال کرنا آسان ہے۔ لیکن اس کا استعمال کرنے کے لئے اسے زیادہ استعمال نہ کریں۔

    اسٹیک اوور فلو پر آئیٹر ٹولز کے غلط استعمال نے اس مسئلے کو حل کرنے میں بہت وقت لیا ہے۔

    متغیر ڈیفالٹ پیرامیٹرز کا استعمال کرتے ہوئے

    میں نے ان میں سے بہت سے دیکھے ہیں:

    def foo(a, b, c=[]):
       # append to c
       # do some more stuff
    

    متغیر ڈیفالٹ پیرامیٹرز کا استعمال نہ کریں ، بلکہ مندرجہ ذیل کا استعمال کریں:

    def foo(a, b, c=None):
     if c is None:
       c = []
       # append to c
       # do some more stuff 
    

    اس سوال کو سمجھنے کے لیے ذیل میں ایک مثال پیش کی گئی ہے جو ہمیں بہت بصری طور پر سمجھنے میں مدد دیتی ہے۔

    In[2]: def foo(a, b, c=[]):
    ...     c.append(a)
    ...     c.append(b)
    ...     print(c)
    ...
    In[3]: foo(1, 1)
    [1, 1]
    In[4]: foo(1, 1)
    [1, 1, 1, 1]
    In[5]: foo(1, 1)
    [1, 1, 1, 1, 1, 1]
    

    اسی c کو اس فنکشن کو ہر بار بلانے پر بار بار حوالہ دیا جاتا ہے۔ اس سے کچھ بہت ہی غیر ضروری نتائج برآمد ہوسکتے ہیں۔


مزید