আমি কিছু কোডে পাইলট চালাচ্ছি এবং "খুব কয়েকটি পাবলিক পদ্ধতি (0/2)" ত্রুটিটি পেয়েছি। এই বার্তাটির অর্থ কী? Pylint ডক্স সহায়ক নয়:
শ্রেণিতে যখন খুব কম পাবলিক পদ্ধতি থাকে তখন ব্যবহৃত হয়, তাই এটি সত্যই এটি মূল্যবান তা নিশ্চিত হন।
আমি কিছু কোডে পাইলট চালাচ্ছি এবং "খুব কয়েকটি পাবলিক পদ্ধতি (0/2)" ত্রুটিটি পেয়েছি। এই বার্তাটির অর্থ কী? Pylint ডক্স সহায়ক নয়:
শ্রেণিতে যখন খুব কম পাবলিক পদ্ধতি থাকে তখন ব্যবহৃত হয়, তাই এটি সত্যই এটি মূল্যবান তা নিশ্চিত হন।
উত্তর:
ত্রুটিটি মূলত বলেছে যে ক্লাসগুলি কেবলমাত্র ডেটা সঞ্চয় করার জন্য নয় , আপনি মূলত ক্লাসটিকে অভিধান হিসাবে বিবেচনা করছেন। শ্রেণিগুলির কাছে যে ডেটা রয়েছে তা চালানোর জন্য কমপক্ষে কয়েকটি পদ্ধতি থাকা উচিত।
যদি আপনার শ্রেণিটি এমন দেখাচ্ছে:
class MyClass(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
এর namedtuple
পরিবর্তে একটি অভিধান বা তার ব্যবহার বিবেচনা করুন । যদিও কোনও শ্রেণি যদি সেরা পছন্দ বলে মনে হয় তবে এটি ব্যবহার করুন। পাইলট সর্বদা জানে না কী সেরা।
মনে রাখবেন যে namedtuple
পরিবর্তনযোগ্য এবং ইনস্ট্যান্টেশনে নির্ধারিত মানগুলি পরে পরিবর্তন করা যায় না cannot
dict
বা ব্যবহার করুন namedtuple
। আপনি যখন নিজের অবজেক্টে কিছু যুক্তি যুক্ত করতে চান তখন একটি ক্লাস ব্যবহার করুন (উদাহরণস্বরূপ, আপনি তৈরি করতে গিয়ে স্টাফগুলি ঘটতে চান, এটি যুক্ত হওয়ার পরে আপনার বিশেষ কিছু ঘটতে হবে, আপনি এটিতে কিছু অপারেশন করতে চান, এটি নিয়ন্ত্রণ করুন কীভাবে এটি প্রদর্শিত, ইত্যাদি)
namedtuple
স্তন্যপান - কুশল সিনট্যাক্স শীর্ষে, আপনি এটি নথিতে বা ডিফল্ট মান সহজে সরবরাহ করতে পারবেন না provide
namedtuple
আমি সিদ্ধান্তটি নিয়ে অনুশোচনা করেছি। নামযুক্ত অ্যাক্সেস এবং ইনডেক্সড অ্যাক্সেস অ্যাট্রিবিউট উভয়কেই মঞ্জুরি দেওয়ার ক্ষেত্রে এটি বেমানান।
যদি আপনি কোনও শ্রেণি প্রসারিত করে থাকেন তবে আমার পরামর্শটি হ'ল পদ্ধতিতে এই সতর্কতাটি অক্ষম করুন এবং সিলারি কার্যগুলির ক্ষেত্রে যেমন:
class MyTask(celery.Task): # pylint: disable=too-few-public-methods
"""base for My Celery tasks with common behaviors; extends celery.Task
...
এমনকি যদি আপনি কেবল একটি একক ফাংশন প্রসারিত করছেন তবে এই কৌশলটি ফাংশনটি করার জন্য আপনার অবশ্যই একটি শ্রেণির প্রয়োজন এবং তৃতীয় পক্ষের ক্লাসগুলিতে হ্যাকিংয়ের চেয়ে প্রসারিত হওয়া অবশ্যই আরও ভাল better
min-public-methods=0
করা [BASIC]
। এটি আপনাকে আপনার সমস্ত disable=
স্টাফ (ইন [MESSAGE CONTROL]
) থেকে পৃথক লাইনে রাখতে দেয় যা আমি খুঁজে পেয়েছি যাতে আপনি কনফিগার পরিবর্তনের পাশাপাশি কীভাবে জিনিস সক্ষম ও অক্ষম করেছেন সে সম্পর্কে বিস্তারিত মন্তব্য যুক্ত করা সহজ করে।
এটি pylint
অন্ধ নিয়মের আরেকটি ঘটনা ।
"ক্লাসগুলি ডেটা সঞ্চয় করার উদ্দেশ্যে নয়" - এটি একটি মিথ্যা বক্তব্য statement ডিকশনারি সব কিছুর জন্য ভাল না। শ্রেণীর ডেটা সদস্য অর্থবহ কিছু, অভিধানের আইটেমটি somethingচ্ছিক কিছু। প্রমাণ: আপনি dictionary.get('key', DEFAULT_VALUE)
একটি প্রতিরোধ করতে পারেন KeyError
, কিন্তু __getattr__
ডিফল্ট সঙ্গে কোন সহজ নেই ।
আমার উত্তর আপডেট করা দরকার। এখনই - আপনার যদি প্রয়োজন হয় তবে struct
আপনার কাছে দুটি দুর্দান্ত বিকল্প রয়েছে:
attrs
এগুলি এর জন্য একটি গ্রন্থাগার:
https://www.attrs.org/en/stable/
import attr
@attr.s
class MyClass(object): # or just MyClass: for Python 3
foo = attr.ib()
bar = attr.ib()
আপনি কী কী অতিরিক্ত পান: কনস্ট্রাক্টর, ডিফল্ট মান, বৈধতা, __repr__
কেবলমাত্র পঠনযোগ্য অবজেক্ট (প্রতিস্থাপন করতে namedtuples
, এমনকি পাইথন 2 তেও নয়) লিখুন writing
dataclasses
(পাই 3.7+)এইচডাব্লুজেপির মন্তব্য অনুসরণ করে আমিও সুপারিশ করছি dataclasses
:
https://docs.python.org/3/library/dataclasses.html
এটি প্রায় হিসাবে ভাল attrs
, এবং পাইথন ৩.++ ব্যতীত অতিরিক্ত নির্ভরতা ছাড়াই একটি স্ট্যান্ডার্ড গ্রন্থাগার ব্যবস্থা ("ব্যাটারি অন্তর্ভুক্ত")।
NamedTuple
দুর্দান্ত নয় - বিশেষত অজগর 3 এর আগে typing.NamedTuple
:
https://docs.python.org/3/library/typing.html#typing.NamedTuple
- আপনার অবশ্যই NamedTuple
"প্যাটার্ন থেকে প্রাপ্ত ক্লাস" পরীক্ষা করা উচিত । পাইথন 2 - namedtuples
স্ট্রিং বর্ণনা থেকে তৈরি - এটি কুশ্রী, খারাপ এবং "স্ট্রিং লিটারেলের ভিতরে প্রোগ্রামিং" বোকা।
আমি দুটি বর্তমান উত্তরের সাথে একমত ("অন্য কিছু ব্যবহারের বিষয়ে বিবেচনা করুন, তবে পাইলটটি সর্বদা সঠিক নয়" - স্বীকৃত উত্তর এবং "পাইলট দমন মন্তব্য ব্যবহার করুন"), তবে আমার নিজস্ব পরামর্শ রয়েছে।
আমাকে আরও একবার এটি নির্দেশ করতে দাও: কিছু ক্লাস কেবলমাত্র ডেটা সঞ্চয় করার জন্য বোঝানো হয়।
এখন বিবেচনা করার বিকল্প - ইউজ- property
আইস।
class MyClass(object):
def __init__(self, foo, bar):
self._foo = foo
self._bar = bar
@property
def foo(self):
return self._foo
@property
def bar(self):
return self._bar
উপরে আপনার কেবল পঠনযোগ্য বৈশিষ্ট্য রয়েছে, যা মান অবজেক্টের জন্য ঠিক (যেমন ডোমেন চালিত ডিজাইনের মতো) তবে আপনি সেটারও সরবরাহ করতে পারেন - এইভাবে আপনার শ্রেণি আপনার যে ক্ষেত্রগুলির জন্য দায় নিতে সক্ষম হবে - উদাহরণস্বরূপ কিছু বৈধকরণ ইত্যাদি করতে (যদি আপনার সেটার থাকে তবে আপনি সেগুলি কনস্ট্রাক্টারে ব্যবহার করে অর্পণ করতে পারেন, অর্থাত্ self.foo = foo
প্রত্যক্ষের পরিবর্তে self._foo = foo
, তবে সতর্কতার সাথে, সেটাররা অন্যান্য ক্ষেত্রগুলি ইতিমধ্যে সূচনা করতে পারে এবং কনস্ট্রাক্টরে আপনার পছন্দসই বৈধতা প্রয়োজন) ।
attrs
লাইব্রেরিটি ব্যবহার করতে পারেন যা dataclasses
মডিউলটি তৈরির জন্য নীলনকশা ছিল ।
namedtuples
উত্তরাধিকারের জন্য অদ্ভুত বাক্য গঠন রয়েছে ... প্রতিটি শ্রেণীর একটি ব্যবহার করে এটির একটি নামযুক্ত টিপল এবং এর __new__
পরিবর্তে ব্যবহার করা আবশ্যক __init__
। dataclasses
এই সীমাবদ্ধতা নেই
যখন আপনার বস একক দায়িত্বের নীতিটি প্রত্যাশা করেন তখন এটি কঠিন, কিন্তু পাইলটটি না বলে। সুতরাং আপনার ক্লাসে একটি দ্বিতীয় পদ্ধতি যুক্ত করুন যাতে আপনার শ্রেণি একক দায়িত্বের নীতি লঙ্ঘন করে। একক দায়িত্বের নীতিটি আপনি কতটা বোঝাতে চেয়েছেন তা দর্শকের নজরে রয়েছে।
আমার ফিক্স,
আমি আমার ক্লাসে একটি অতিরিক্ত পদ্ধতি যুক্ত করেছি, সুতরাং এটি এখন 2 টি কাজ করে।
def __str__(self):
return self.__class__.__name__
আমি কেবল ভাবছি এখনই আমার ক্লাসটি 2 টি পৃথক ফাইলে এবং মডিউলগুলি পাশাপাশি বিভক্ত করা দরকার কিনা।
সমস্যাটি সমাধান হয়েছে, তবে আমার সহকর্মীদের সাথে নয় যারা এই জীবন এবং মৃত্যুর মতো সারাদিন অনুপস্থিতিতে বিতর্ক করে।