অজগরটিকে "উইথ" স্টেটমেন্টটি ব্যবহার-বাদ দিয়ে চেষ্টা করুন


99

এই চেষ্টা কি ব্লক ব্যবহার করে "স্টেটমেন্ট" দিয়ে অজগরটি ব্যবহার করার সঠিক উপায়?

try:
    with open("file", "r") as f:
        line = f.readline()
except IOError:
    <whatever>

যদি এটি হয়, তবে জিনিসগুলি করার পুরানো পদ্ধতিটি বিবেচনা করুন:

try:
    f = open("file", "r")
    line = f.readline()
except IOError:
    <whatever>
finally:
    f.close()

এখানে "উইথ" স্টেটমেন্টের প্রাথমিক সুবিধাটি কি আমরা তিন লাইনের কোড থেকে মুক্তি পেতে পারি? এই ব্যবহারের ক্ষেত্রে এটি আমার কাছে বাধ্যতামূলক বলে মনে হয় না (যদিও আমি বুঝতে পারি যে "সহ" বিবৃতিটির অন্যান্য ব্যবহার রয়েছে)।

সম্পাদনা: উপরের কোডের দুটি ব্লকের কার্যকারিতা কি অভিন্ন?

সম্পাদনা 2: প্রথম কয়েকটি উত্তর সাধারণত "সাথে" ব্যবহারের সুবিধাগুলি সম্পর্কে কথা বলে তবে সেগুলি এখানে প্রান্তিক উপকার বলে মনে হয়। আমরা সবাই বছরের পর বছর ধরে স্পষ্টভাবে f.close () কল করছি। আমি মনে করি এর একটি উপকারিতা হ'ল স্লোপি কোডারগুলি "উইথ" ব্যবহার করে উপকৃত হবে।



আমার জন্য, শেষের বিবৃতিতে () জিনিসগুলি বন্ধ করে রাখার কথা মনে না রাখাই 'উইথ' ব্যবহার করার যথেষ্ট উপযুক্ত কারণ। আমি দেখেছি প্রচুর কোড এর সংস্থানগুলি বন্ধ করতে ব্যর্থ। এবং 'উইথ' এর যতটুকু আমি দেখতে পাচ্ছি ত্রুটি নেই।
রাউল সালিনাস-

উত্তর:


143
  1. আপনি যে দুটি কোড ব্লক দিয়েছেন তা সমতুল্য নয়
  2. জিনিসগুলি করার পুরানো উপায় হিসাবে আপনি যে কোডটি বর্ণনা করেছেন তাতে একটি মারাত্মক বাগ রয়েছে: ফাইলটি খোলার ক্ষেত্রে ব্যর্থ হওয়ার ক্ষেত্রে আপনি finallyদফায় একটি দ্বিতীয় ব্যতিক্রম পাবেন কারণ fআবদ্ধ নয়।

সমতুল্য পুরাতন স্টাইলের কোডটি হ'ল:

try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

আপনি দেখতে পাচ্ছেন যে, withবিবৃতিটি কম ত্রুটি প্রবণ করে তুলতে পারে। পাইথনের নতুন সংস্করণগুলিতে (২.7, ৩.১), আপনি একটি withবিবৃতিতে একাধিক এক্সপ্রেশনও একত্র করতে পারেন । উদাহরণ স্বরূপ:

with open("input", "r") as inp, open("output", "w") as out:
    out.write(inp.read())

তা ছাড়া, যত তাড়াতাড়ি সম্ভব ব্যতিক্রম ধরা আমি ব্যক্তিগতভাবে এটিকে খারাপ অভ্যাস হিসাবে বিবেচনা করি। এটি ব্যাতিক্রমের উদ্দেশ্য নয়। আইও ফাংশন যা ব্যর্থ হতে পারে যদি আরও জটিল অপারেশনের অংশ হয় তবে বেশিরভাগ ক্ষেত্রে আইওআররারের পুরো অপারেশনটি বাতিল করা উচিত এবং তাই বাইরের স্তরে পরিচালনা করা উচিত। withবিবৃতি ব্যবহার করে , আপনি try...finallyঅভ্যন্তরীণ স্তরে এই সমস্ত বিবৃতি থেকে মুক্তি পেতে পারেন ।


7

যদি finallyব্লকের বিষয়বস্তুগুলি ফাইলের অবজেক্টের খোলার বৈশিষ্ট্যগুলি দ্বারা নির্ধারিত হয় তবে ফাইল অবজেক্টের প্রয়োগকারীরা finallyব্লকটি লেখার জন্য কেন হবে না ? এইwith বিবৃতিটির সুবিধা, এই বিশেষ পরিস্থিতিতে আপনাকে তিন লাইনের কোড সংরক্ষণের চেয়ে অনেক বেশি।

এবং হ্যাঁ, আপনি যেভাবে সম্মিলন করেছেন withএবং try-exceptএটি করার একমাত্র উপায়, কারণ openবিবৃতিতে ঘটে যাওয়া ব্যতিক্রমী ত্রুটিগুলি withব্লকের মধ্যে ধরা যায় না ।


1

আমি মনে করি আপনি "উইথ" স্টেটমেন্টটি সম্পর্কে ভুল বলেছেন যে এটি কেবল রেখাগুলি হ্রাস করে। এটি আসলে সূচনা এবং টিয়ারডাউন পরিচালনা করে।

আপনার ক্ষেত্রে "উইথ" করে

  • একটি ফাইল খুলুন,
  • এর বিষয়বস্তুগুলি প্রক্রিয়া করুন এবং and
  • এটি বন্ধ করতে ভুলবেন না।

"উইথ" স্টেটমেন্টটি বোঝার জন্য এখানে লিঙ্কটি দেওয়া হয়েছে: http://effbot.org/zone/python-with-statement.htm

সম্পাদনা: হ্যাঁ আপনার "সহ" এর ব্যবহারটি সঠিক এবং কোডের উভয় ব্লকের কার্যকারিতা অভিন্ন। "সাথে" ব্যবহার করবেন কেন সে সম্পর্কে প্রশ্ন? এটি আপনি এটি পেতে সুবিধার কারণে। যেমন আপনি দুর্ঘটনাক্রমে f.close () নিখোঁজ সম্পর্কে উল্লেখ করেছেন।


-4

নিম্নলিখিত কোডগুলির জন্য আরও পাইথোনিক উপায়:

try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

try:
    f = open("file", "r")
except IOError:
    <whatever>
else:
    f.close()

4
আমি আপনার জন্য কোড বিন্যাস যুক্ত করেছি; এটি পড়া সহজ করে তোলে। তবে আপনি যে ইনডেন্টিংটি ভাঙেননি তা নিশ্চিত করতে আপনি ডাবল-চেক করতে চাইতে পারেন।
andrewsi

4
না, আপনার সংস্করণটি মূল কোডের মতো একই কাজ করে না। এমনকি আপনি অনুপস্থিত readline()কলটি যুক্ত করলেও , যদি কোনও readline()ফলাফল আসে তবে আপনার সংস্করণটি ফাইলটি বন্ধ করে না IOError
আলেক্সি তোড়হামো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.