0
پر توجہ دیں
0
پیروکار

ازگر: براہ کرم ان جگہوں پر محتاط رہیں

میں تخلیق کیا: 2016-12-29 13:46:12, تازہ کاری:
comments   0
hits   1385

ازگر: براہ کرم ان جگہوں پر محتاط رہیں

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

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

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

  $ python --version
  Python 2.7.9

پیتھون ورژن مینجمنٹ

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

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

بہت سے لوگوں نے یہ دعویٰ کیا ہے کہ میں نے ایک ہی لائن کوڈ کے ساتھ تمام مسائل کو حل کیا ہے ، حالانکہ ان کا کوڈ عام طور پر لکھے جانے سے کہیں زیادہ غیر موثر ہے ، اور یہ بھی کہ یہ پڑھنے میں زیادہ مشکل ہے ، یہاں تک کہ یہ متضاد بھی ہے۔

  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))]

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

کوڈ کی ایک لائن پر قابو پانا کوئی بڑی کامیابی نہیں ہے ، حالانکہ بعض اوقات یہ خاص طور پر ذہین لگتا ہے۔

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

یہ ایک بہت ہی نازک سوال ہے اور بعض اوقات آپ کو اس سے بھی زیادہ حیران کر دیتا ہے۔

  >>> { 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 ایک طرح سے list کو container میں رکھنے کی طرح ہے۔ ان کا فرق یہ ہے کہ set کی کوئی دوہرائی نہیں ہوتی اور وہ بے ترتیب ہوتی ہے۔ لوگ عام طور پر {} کو خالی set سمجھتے ہیں، لیکن ایسا نہیں ہے، یہ ایک خالی dict ہے۔

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

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

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

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

  • GIL کی غلطی

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

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

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

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

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

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

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

  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)

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

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

آپ کے لئے بہت سارے اختیارات ہیں جو آپ itertools میں کرسکتے ہیں۔ اگر آپ چاہتے ہیں کہ itertools میں آپ کی ضرورت ہو تو یہ آسان ہے۔ لیکن اس کے استعمال کے ل too اس کا استعمال نہ کریں۔

itertools کے غلط استعمال نے StackOverflow کے ایک بڑے دیو کو اس کو ٹھیک کرنے میں کافی وقت لگا دیا ہے۔

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

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

  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 کو ہر بار اس فنکشن کو کال کرنے پر ایک بار پھر حوالہ دیا جاتا ہے۔ اس سے کچھ بہت ہی غیر ضروری نتائج برآمد ہوسکتے ہیں۔