পাইথন, ডেল বা ডেল্ট্রারে ভাল কোনটি?


180

এটি মূর্খ হতে পারে, তবে এটি আমার মস্তিষ্কের পিছনে কিছুক্ষণ ধরে কড়া নাড়ছে।

পাইথন আমাদের দুটি বস্তু থেকে বৈশিষ্ট্যগুলি মুছে ফেলার জন্য বিল্ট-ইন দুটি উপায় দেয়, ডেল কমান্ড শব্দ এবং ডেল্ট্রার অন্তর্নির্মিত ফাংশন। আমি delattr পছন্দ করি কারণ এটি আমার মনে হয় এটি আরও খানিকটা সুস্পষ্ট:

del foo.bar
delattr(foo, "bar")

তবে আমি ভাবছি যে তাদের মধ্যে হুডের নীচে কিছু পার্থক্য থাকতে পারে।

উত্তর:


265

প্রথমটি দ্বিতীয়টির চেয়ে বেশি দক্ষ। del foo.barদুটি বাইকোড নির্দেশনা সংকলন:

  2           0 LOAD_FAST                0 (foo)
              3 DELETE_ATTR              0 (bar)

যেখানে delattr(foo, "bar")পাঁচটি লাগে:

  2           0 LOAD_GLOBAL              0 (delattr)
              3 LOAD_FAST                0 (foo)
              6 LOAD_CONST               1 ('bar')
              9 CALL_FUNCTION            2
             12 POP_TOP             

এটি প্রথম দৌড়কে সামান্য দ্রুত অনুবাদ করে (

অন্যরা যেমন বলেছে, আপনার মুছে ফেলা বৈশিষ্ট্যটি গতিশীলভাবে নির্ধারণ করা হয় তখন আপনার দ্বিতীয় ফর্মটি ব্যবহার করা উচিত।

[কোনও ফাংশনের অভ্যন্তরে তৈরি বাইকোড নির্দেশাবলী দেখানোর জন্য সম্পাদিত, যেখানে সংকলকটি ব্যবহার করতে পারে LOAD_FASTএবং LOAD_GLOBAL]


6
আপনি এটি তৈরি করতে কোন সরঞ্জামটি ব্যবহার করেছেন?
ট্রিপটিচ

33
disমডিউল। আপনি এটিকে python -m disকিছু কোড ব্যবহার করে এবং টাইপ করে কমান্ড লাইন থেকে চালাতে পারেন , বা এর সাথে কোনও ফাংশন বিচ্ছিন্ন করতে পারেন dis.dis()
মাইলস

15
অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল। ;-) তবে হ্যাঁ, আপনি অবশ্যই ঠিক বলেছেন।
লেনার্ট রেগেবর

26
.. সুতরাং এটি অনুসরণ করে যে অর্থের ভালবাসা অকাল অপটিমাইজেশন?
জন ফুহি

5
অকাল অপটিমাইজেশন অর্থের ভালবাসার একটি উপসেট, কারণ এর অর্থ আপনি প্রসেসিং পাওয়ারে কম ব্যয় করার চেষ্টা করছেন :)
রব গ্রান্ট

41
  • ডেল আরও স্পষ্ট এবং দক্ষ;
  • delattr গতিশীল বৈশিষ্ট্য মোছার অনুমতি দেয়।

নিম্নলিখিত উদাহরণগুলি বিবেচনা করুন:

for name in ATTRIBUTES:
    delattr(obj, name)

বা:

def _cleanup(self, name):
    """Do cleanup for an attribute"""
    value = getattr(self, name)
    self._pre_cleanup(name, value)
    delattr(self, name)
    self._post_cleanup(name, value)

আপনি ডেল দিয়ে এটি করতে পারবেন না ।


2
আপনি ডেল দিয়ে দ্বিতীয়টি করতে পারেন। del self.__dict__[name], ধরে নেওয়া অবশ্যই মেটা ক্লাসের সাথে কোনও মজার ব্যবসা চলছে না
smac89

17

সন্দেহাতীতভাবে প্রাক্তন আমার দৃষ্টিতে এটি এর foo.barচেয়ে উত্তম কিনা তা জিজ্ঞাসার মতো getattr(foo, "bar")এবং আমি মনে করি না যে কেউ এই প্রশ্ন জিজ্ঞাসা করছে :)


3
আমি নিশ্চিত যে সেখানে কমপক্ষে একজন ব্যক্তি আছেন যা foo.bar এর চেয়ে getattr (foo, "বার") পছন্দ করবে। মঞ্জুর, আমি তাদের সাথে একমত হব না। তবে সেই এক ব্যক্তি এখনও এটিকে সন্দেহাতীতভাবে পূর্বের হিসাবে তৈরি করার পক্ষে যথেষ্ট।
জেসন বেকার

3
@ জেসন তারপরে আপনার বাক্যাংশটি ব্যাখ্যা করে অন্য কোনও কিছুর চেয়ে "সন্দেহাতীতভাবে ভাল" কিছুই নয়। আমি মনে করি এটি "সন্দেহাতীতভাবে" এর নিখুঁত যুক্তিসঙ্গত ব্যবহার।
ফোব

26
গ্যাটট্রাট অগ্রাধিকারযোগ্য যখন সম্পত্তিটির অস্তিত্ব না থাকার সম্ভাবনা থাকে এবং আপনি ব্লক ব্যতীত / চেষ্টা না করে লেখার জন্য একটি ডিফল্ট মান সেট করতে চান। অর্থাত। gettattr (foo, "বার", কিছুই নেই)
মার্ক গিবনস

2
@ মার্কগিবনস: অপেক্ষা করুন, এটা একটা জিনিস? আমি সর্বদা প্যাটার্নটি ব্যবহার করেছি if hasattr(obj, 'var') and obj.var == ...... if getattr(obj, 'var', None) == ...বেশিরভাগ ক্ষেত্রেই কেবল আমি এটিকে হ্রাস করতে পারতাম ! আমি মনে করি সামান্য খাটো এবং পড়া সহজ।
আর্টঅফ ওয়ারফেয়ার

@ আর্টঅফ ওয়ারফেয়ার hasattrআসলে কল করেgetattr
চেনিয়েল

14

এটি সত্যিই পছন্দের বিষয়, তবে প্রথমটি সম্ভবত পছন্দনীয়। আমি কেবল তখনই দ্বিতীয়টি ব্যবহার করব যদি আপনি সময়ের আগে যে বৈশিষ্ট্যটি মুছে ফেলছেন তার নাম না জানলে।


5

গেট্যাটটর এবং সেট্যাটটারের মতো, ডেলাট্রাট কেবল তখনই ব্যবহার করা উচিত যখন বৈশিষ্ট্যের নামটি অজানা।

এই অর্থে, এটি প্রায় বেশ কয়েকটি পাইথন বৈশিষ্ট্যের সমতুল্য যা সাধারণত আপনি যেগুলি পাওয়া যায় তার চেয়ে কম স্তরে অন্তর্নির্মিত কার্যকারিতা অ্যাক্সেস করতে ব্যবহৃত হয়, যেমন __import__পরিবর্তে importএবং operator.addপরিবর্তে+


3

অভ্যন্তরীণ কর্ম সম্পর্কে নিশ্চিত নয়, তবে একটি কোড পুনরায় ব্যবহারযোগ্যতা থেকে এবং কোনও জটলা সহকর্মী দৃষ্টিকোণ না হয়ে ডেল ব্যবহার করুন। এটি অন্যান্য ভাষা থেকে আসা লোকেরা আরও স্পষ্ট এবং বোঝে।


1

আপনি যদি delattrআরও সুস্পষ্ট বলে মনে করেন , তবে কেন আপনি getattrসমস্ত সময় না দিয়ে ব্যবহার করবেন object.attr?

হুডের নিচে ... আপনার অনুমানও আমার মতোই ভাল। উল্লেখযোগ্যভাবে আরও ভাল না হলে।


1

এটি একটি পুরানো প্রশ্ন, তবে আমি আমার 2 সেন্ট ভিতরে রাখতে চাই।

যদিও del foo.barএটি আরও মার্জিত, অনেক সময় আপনার প্রয়োজন হবে delattr(foo, "bar")। বলুন, আপনার যদি একটি ইন্টারেক্টিভ কমান্ড লাইন ইন্টারফেস থাকে যা কোনও ব্যবহারকারীকে নাম লিখে টাইপ করে কোনও বস্তুর কোনও সদস্যকে মুছে ফেলতে দেয় , তবে পরবর্তী ফর্মটি ব্যবহার করা ছাড়া আপনার কোনও বিকল্প নেই।

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