পাইথন: __init__ এর মধ্যে ব্যতিক্রম বাড়ানো কি খারাপ ফর্ম?


128

এর মধ্যে কি ব্যতিক্রম বাড়াতে খারাপ ফর্ম হিসাবে বিবেচনা করা হয় __init__? যদি তা হয়, তবে নির্দিষ্ট শ্রেণীর ভেরিয়েবলগুলি Noneভুল টাইপের হিসাবে আরম্ভ করা হলে ত্রুটি নিক্ষেপের গ্রহণযোগ্য পদ্ধতি কী ?


সি তে, এটি ডেস্ট্রাক্টরগুলিতে একটি ব্যতিক্রম বাড়াতে খারাপ ফর্ম, তবে কনস্ট্রাক্টর ভাল থাকতে হবে।
ক্লেথ 0

6
@ ক্যালিথ, আপনি সি ++ বলতে চাইছেন - সি তে কোনও নির্মাণকারী বা ধ্বংসকারী নেই
অ্যালেক্স মার্টেলি

4
... বা ব্যতিক্রম, এই বিষয়ে।
ম্যাট ওয়াইল্ডিং

@ ক্যালিথ: হ্যাঁ, দয়া করে একটি নির্দোষ টাইপো দ্বারা বানানো অযৌক্তিক বক্তব্যটি সরিয়ে দিন ;-)
lpapp

4
হ্যাঁ সি ++। FML। এবং আমি মন্তব্যটি সম্পাদন করতে পারিনি। সুতরাং ইন্টারনেট আমার
বোকামি

উত্তর:


159

ভিতরে ব্যতিক্রম উত্থাপন __init__() একেবারে ঠিক আছে। কোনও কনস্ট্রাক্টরের মধ্যে ত্রুটির শর্তটি নির্দেশ করার মতো অন্য কোনও ভাল উপায় নেই এবং স্ট্যান্ডার্ড লাইব্রেরিতে এমন অনেক শত উদাহরণ রয়েছে যেখানে কোনও বস্তু তৈরি করা ব্যতিক্রম বাড়াতে পারে।

উত্থাপিত ত্রুটি শ্রেণি অবশ্যই আপনার উপর নির্ভর করে। ValueErrorসবচেয়ে ভাল যদি কনস্ট্রাক্টর একটি অবৈধ প্যারামিটার পাস করে।


14
কনস্ট্রাক্টারে সর্বাধিক ব্যবহৃত ব্যতিক্রমগুলি হ'ল ValueErrorএবং TypeError
ডেনিস ওটকিডাচ

9
কেবল দেখানো যে __init__এটি নির্মাণকারী নয়, এটি অন্তর্নিদীকরণকারী। আপনি লাইনটি সম্পাদনা করতে চাইতে পারেন কোনও কনস্ট্রাক্টরের মধ্যে ত্রুটি শর্তটি বোঝানোর জন্য আর কোনও ভাল উপায় নেই, ..
হারিস

26

এটি সত্য যে কোনও নির্মাণকারীর মধ্যে ত্রুটি চিহ্নিত করার একমাত্র সঠিক উপায় ব্যতিক্রম বাড়িয়ে তুলছে। এ কারণেই সি ++ এবং অন্যান্য অবজেক্ট-ভিত্তিক ভাষাগুলিতে যেগুলি ব্যতিক্রমী সুরক্ষার কথা মাথায় রেখে তৈরি করা হয়েছে, কোনও বস্তুর নির্মাতাকে কোনও ব্যতিক্রম নিক্ষেপ করা হলে তাকে ধ্বংসকারী বলা হয় না (অর্থাত্ বস্তুর সূচনাটি অসম্পূর্ণ)। পাইথনের মতো স্ক্রিপ্টিং ভাষার ক্ষেত্রে এটি প্রায়শই হয় না। উদাহরণস্বরূপ, সকেট কোড-কানেক্ট () ব্যর্থ হলে নিম্নলিখিত কোডটি একটি অ্যাট্রিবিউটআর্র ফেলে দেয়:

class NetworkInterface:
    def __init__(self, address)
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect(address)
        self.stream = self.socket.makefile()

    def __del__(self)
        self.stream.close()
        self.socket.close()

কারণটি হ'ল স্ট্রিম বৈশিষ্ট্যটি আরম্ভ করার আগে সংযোগ প্রচেষ্টা ব্যর্থ হওয়ার পরে অসম্পূর্ণ অবজেক্টের ডেস্ট্রাক্টরকে ডাকা হয়। আপনি নির্মাণকারীদের থেকে ব্যতিক্রম ছোঁড়া এড়ানো উচিত নয়, আমি কেবল বলছি যে পাইথনে সম্পূর্ণ ব্যতিক্রমী নিরাপদ কোডটি লেখা শক্ত। কিছু পাইথন বিকাশকারী পুরোপুরি ডেস্ট্রাক্টর ব্যবহার করা এড়ায় না, তবে এটি অন্য বিতর্কের বিষয়।


এই উত্তরটি সত্যিই দরকারী। এটি কেবল "সবুজ আলো" সম্পর্কে কথা বলছে না, তবে "ধ্বংসকারী" সহ একটি উদাহরণ উল্লেখ করেছে।
lpapp

আপনার পাইথন কোড এতে ব্যর্থ হয়েছে __del__কারণ এটি খারাপভাবে লেখা হয়েছে। আপনি যদি this->p_socket->close()সি +++ তে কোনও ডেস্ট্রাক্টর করে থাকেন তবে আপনার ঠিক একই সমস্যা হবে । সি ++ এ আপনি তা করবেন না - আপনি সদস্যটির বিষয়টিকে নিজেরাই ধ্বংস করতে দেবেন। অজগর একই কাজ।
এরিক

1
@ এরিক @ সি ++ এ আমার সমস্যা হবে না কারণ সি ++ সঠিকভাবে আরম্ভ করা হয়নি এমন বস্তুগুলি ধ্বংস করে নাকন্সট্রাক্টরের রিসোর্সগুলি বরাদ্দ করা এবং ডেস্ট্রাক্টরগুলিতে তাদের অপসারণ করা প্রকৃতপক্ষে এটি সি ++ এর মধ্যে একটি খুব সাধারণ প্রতিমা । আপনি পরামর্শ দিচ্ছেন যে সদস্য অবজেক্টটি নিজেকে ধ্বংস করে দেয় (তার ডেস্ট্রাক্টরের রিসোর্সগুলি হ্রাস করে) - তারপরে সদস্য শ্রেণিটি লেখার সময় একই সমস্যা দেখা দেয়।
সেপ্পো এনার্ভি

11

এটির কোনও খারাপ কারণ হওয়া উচিত বলে আমি কোনও কারণ দেখছি না।

বিপরীতে, ব্যতিক্রমগুলির একটির ভাল কাজ করার জন্য পরিচিত, ত্রুটি কোডগুলি ফিরিয়ে দেওয়ার বিরোধিতা হিসাবে, ত্রুটি কোডগুলি সাধারণত কনস্ট্রাক্টর দ্বারা ফেরত দেওয়া যায় না । কমপক্ষে সি ++ এর মতো ভাষায়, ব্যতিক্রমগুলি উত্থাপনই ত্রুটিগুলি চিহ্নিত করার একমাত্র উপায়।


6

মানক গ্রন্থাগারটি বলে:

>>> f = file("notexisting.txt")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'notexisting.txt'

এছাড়াও এটিকে খারাপ ফর্ম হিসাবে বিবেচনা করার কোনও কারণ আমি সত্যিই দেখছি না।


3

আমার মনে করা উচিত এটি অন্তর্নির্মিত ValueErrorব্যতিক্রমগুলির জন্য উপযুক্ত ক্ষেত্রে ।


2

আমি উপরোক্ত সকলের সাথে একমত

ব্যতিক্রম উত্থাপন ব্যতীত অন্য কোনও বস্তুর সূচনাতে কিছু ভুল হয়েছে বলে সিগন্যাল করার সত্যিই অন্য উপায় নেই।

বেশিরভাগ প্রোগ্রামের ক্লাসগুলিতে যেখানে শ্রেণীর রাজ্য সম্পূর্ণরূপে সেই শ্রেণীর ইনপুটগুলির উপর নির্ভরশীল হয় আমরা আশা করতে পারি যে কোনও ধরণের ভ্যালুয়েরর বা টাইপআরারের উত্থাপিত হবে।

পার্শ্ব-প্রতিক্রিয়াযুক্ত ক্লাসগুলি (যেমন একটি যা নেটওয়ার্কিং বা গ্রাফিক্স করে) থাই-তে একটি ত্রুটি বাড়িয়ে তুলতে পারে (উদাহরণস্বরূপ) যদি নেটওয়ার্ক ডিভাইসটি অনুপলব্ধ থাকে বা ক্যানভাস অবজেক্টে লিখিত না যায়। এটি আমার কাছে বোধগম্য বলে মনে হয় কারণ প্রায়শই আপনি ব্যর্থতার পরিস্থিতি যত তাড়াতাড়ি সম্ভব জানতে চান।


2

থিম থেকে ত্রুটি উত্থাপন কিছু ক্ষেত্রে অনিবার্য, তবে থ্রিতে খুব বেশি কাজ করা একটি খারাপ স্টাইল। আপনার একটি কারখানা বা ছদ্ম-কারখানা তৈরি করা বিবেচনা করা উচিত - একটি সাধারণ শ্রেণিবদ্ধ যা সেট আপ করা অবজেক্টটিকে ফেরত দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.