পাইলটের "খুব কয়েকটি পাবলিক পদ্ধতি" বার্তার অর্থ কী


110

আমি কিছু কোডে পাইলট চালাচ্ছি এবং "খুব কয়েকটি পাবলিক পদ্ধতি (0/2)" ত্রুটিটি পেয়েছি। এই বার্তাটির অর্থ কী? Pylint ডক্স সহায়ক নয়:

শ্রেণিতে যখন খুব কম পাবলিক পদ্ধতি থাকে তখন ব্যবহৃত হয়, তাই এটি সত্যই এটি মূল্যবান তা নিশ্চিত হন।


1
আপনার ক্লাসটি কেমন দেখাচ্ছে? ক্লাসটি স্টোর ডেটা বাদে অন্য কিছু করে?
ব্লেন্ডার

1
সমস্ত ক্লাস হয় স্টোর ডেটা।
দৈত্য

2
ঠিক আছে, আপনার সমস্যা আছে। ক্লাসগুলি ডেটা সঞ্চয় করার উদ্দেশ্যে নয়। অভিধান এবং তালিকার মতো ডেটা স্ট্রাকচারের জন্য এটি।
ব্লেন্ডার

মজার, ধন্যবাদ! পাইলট ত্রুটি বার্তাটি আরও দরকারী করা যেতে পারে। যাইহোক, আপনার মন্তব্যকে উত্তরে পরিণত করতে দ্বিধা বোধ করুন এবং আমি অনুমোদন করব।
দৈত্য

6
তবে "কয়েক" এর সংজ্ঞা কোথায়? আমি ঠিক একটি পদ্ধতি পেয়েছি। এই কারণেই ক্লাসটি বিদ্যমান। পাইলট কীভাবে "কয়েকটি" সংজ্ঞায়িত করে? 2 এরও বেশি? কেন?
জোর্ডিড

উত্তর:


124

ত্রুটিটি মূলত বলেছে যে ক্লাসগুলি কেবলমাত্র ডেটা সঞ্চয় করার জন্য নয় , আপনি মূলত ক্লাসটিকে অভিধান হিসাবে বিবেচনা করছেন। শ্রেণিগুলির কাছে যে ডেটা রয়েছে তা চালানোর জন্য কমপক্ষে কয়েকটি পদ্ধতি থাকা উচিত।

যদি আপনার শ্রেণিটি এমন দেখাচ্ছে:

class MyClass(object):
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar

এর namedtupleপরিবর্তে একটি অভিধান বা তার ব্যবহার বিবেচনা করুন । যদিও কোনও শ্রেণি যদি সেরা পছন্দ বলে মনে হয় তবে এটি ব্যবহার করুন। পাইলট সর্বদা জানে না কী সেরা।

মনে রাখবেন যে namedtupleপরিবর্তনযোগ্য এবং ইনস্ট্যান্টেশনে নির্ধারিত মানগুলি পরে পরিবর্তন করা যায় না cannot


72
"পাইলট সেরা কী জানে না" এর জন্য +1 - নিজের রায় ব্যবহার করুন তবে একটি নিয়ম হিসাবে, আপনার যা প্রয়োজন তা যদি "স্ট্রাক্ট" হয় তবে একটি dictবা ব্যবহার করুন namedtuple। আপনি যখন নিজের অবজেক্টে কিছু যুক্তি যুক্ত করতে চান তখন একটি ক্লাস ব্যবহার করুন (উদাহরণস্বরূপ, আপনি তৈরি করতে গিয়ে স্টাফগুলি ঘটতে চান, এটি যুক্ত হওয়ার পরে আপনার বিশেষ কিছু ঘটতে হবে, আপনি এটিতে কিছু অপারেশন করতে চান, এটি নিয়ন্ত্রণ করুন কীভাবে এটি প্রদর্শিত, ইত্যাদি)
বুরহান খালিদ

বিস্তারিত প্রতিক্রিয়া জন্য ধন্যবাদ! আমার ব্যবহারের ক্ষেত্রে বুরহান যা বলেছিল তার অনুরূপ, আমি ডেটা তৈরি করার সময় কিছু প্রসেসিং করছি।
দৈত্য

6
আপনার শ্রেণীর সংজ্ঞাটির ভিতরে যদি মেটা (মেটাক্লাস) থাকে তবে এই ত্রুটিটি কোনও অর্থবোধ করে না।
আলেকজান্দার_ch

11
namedtupleস্তন্যপান - কুশল সিনট্যাক্স শীর্ষে, আপনি এটি নথিতে বা ডিফল্ট মান সহজে সরবরাহ করতে পারবেন না provide
rr-

6
যতবার আমি ব্যবহার করেছি namedtupleআমি সিদ্ধান্তটি নিয়ে অনুশোচনা করেছি। নামযুক্ত অ্যাক্সেস এবং ইনডেক্সড অ্যাক্সেস অ্যাট্রিবিউট উভয়কেই মঞ্জুরি দেওয়ার ক্ষেত্রে এটি বেমানান।
থিয়োরিফাইস

39

যদি আপনি কোনও শ্রেণি প্রসারিত করে থাকেন তবে আমার পরামর্শটি হ'ল পদ্ধতিতে এই সতর্কতাটি অক্ষম করুন এবং সিলারি কার্যগুলির ক্ষেত্রে যেমন:

class MyTask(celery.Task):  # pylint: disable=too-few-public-methods                                                                                   
    """base for My Celery tasks with common behaviors; extends celery.Task

    ...             

এমনকি যদি আপনি কেবল একটি একক ফাংশন প্রসারিত করছেন তবে এই কৌশলটি ফাংশনটি করার জন্য আপনার অবশ্যই একটি শ্রেণির প্রয়োজন এবং তৃতীয় পক্ষের ক্লাসগুলিতে হ্যাকিংয়ের চেয়ে প্রসারিত হওয়া অবশ্যই আরও ভাল better


এই ডাইবেবলটি রাখার পরে, প্রাক-প্রতিশ্রুতি এখন আমাকে দেয়: খারাপ বিকল্প মান 'খুব-কিছু-পাবলিক-পদ্ধতি' (খারাপ-বিকল্প-মান)
বুধবার

আপনি কি পদ্ধতিতে 'গুলি' অন্তর্ভুক্ত করেছিলেন? আপনার খারাপ-বিকল্প-মান্তার বার্তাটিতে এটি নেই।
ঋষি

4
সম্ভবত এটি অক্ষম করার আরও ভাল উপায় হ'ল কনফিগারেশন ফাইলের বিভাগে সেট min-public-methods=0করা [BASIC]। এটি আপনাকে আপনার সমস্ত disable=স্টাফ (ইন [MESSAGE CONTROL]) থেকে পৃথক লাইনে রাখতে দেয় যা আমি খুঁজে পেয়েছি যাতে আপনি কনফিগার পরিবর্তনের পাশাপাশি কীভাবে জিনিস সক্ষম ও অক্ষম করেছেন সে সম্পর্কে বিস্তারিত মন্তব্য যুক্ত করা সহজ করে।
সিজেএস 5:43

15

এটি 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, তবে সতর্কতার সাথে, সেটাররা অন্যান্য ক্ষেত্রগুলি ইতিমধ্যে সূচনা করতে পারে এবং কনস্ট্রাক্টরে আপনার পছন্দসই বৈধতা প্রয়োজন) ।


2
পাইথন ৩.7 এবং তারপরে, ডেটাচলস একটি ভাল সমাধান সরবরাহ করে, নামধারী স্তরের কিছু কদর্যতা সম্বোধন করে এবং তারা ডিডিডি মান অবজেক্টের জন্য নিখুঁত
hwjp

আমি সম্মতি জানাই, এবং 2020 থেকে এটি যাওয়ার মানক উপায় way একটি বিস্তৃত সংস্করণ-পরিসীমা ব্যবস্থা রাখার জন্য (২.3, ৩.৩++ যদি আমি মনে করি) আপনি attrsলাইব্রেরিটি ব্যবহার করতে পারেন যা dataclassesমডিউলটি তৈরির জন্য নীলনকশা ছিল ।
টমসজ গেন্ডার

namedtuplesউত্তরাধিকারের জন্য অদ্ভুত বাক্য গঠন রয়েছে ... প্রতিটি শ্রেণীর একটি ব্যবহার করে এটির একটি নামযুক্ত টিপল এবং এর __new__পরিবর্তে ব্যবহার করা আবশ্যক __init__dataclassesএই সীমাবদ্ধতা নেই
এরিক অ্যারোনস্টি

4

যখন আপনার বস একক দায়িত্বের নীতিটি প্রত্যাশা করেন তখন এটি কঠিন, কিন্তু পাইলটটি না বলে। সুতরাং আপনার ক্লাসে একটি দ্বিতীয় পদ্ধতি যুক্ত করুন যাতে আপনার শ্রেণি একক দায়িত্বের নীতি লঙ্ঘন করে। একক দায়িত্বের নীতিটি আপনি কতটা বোঝাতে চেয়েছেন তা দর্শকের নজরে রয়েছে।

আমার ফিক্স,

আমি আমার ক্লাসে একটি অতিরিক্ত পদ্ধতি যুক্ত করেছি, সুতরাং এটি এখন 2 টি কাজ করে।

def __str__(self):
    return self.__class__.__name__

আমি কেবল ভাবছি এখনই আমার ক্লাসটি 2 টি পৃথক ফাইলে এবং মডিউলগুলি পাশাপাশি বিভক্ত করা দরকার কিনা।

সমস্যাটি সমাধান হয়েছে, তবে আমার সহকর্মীদের সাথে নয় যারা এই জীবন এবং মৃত্যুর মতো সারাদিন অনুপস্থিতিতে বিতর্ক করে।

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