পাইচার্ম কেন স্ট্যাটিক পদ্ধতিতে পরিবর্তন করার প্রস্তাব দেয়


154

নতুন পাইচার্ম রিলিজ (3.1.3 সম্প্রদায় সংস্করণ) বর্তমান পদার্থের স্থিতির সাথে কাজ করে না এমন পদ্ধতিগুলিকে স্থিতিতে রূপান্তর করার প্রস্তাব দিয়েছে।

এখানে চিত্র বর্ণনা লিখুন

এর ব্যবহারিক কারণ কী? কিছু ধরণের মাইক্রো পারফরম্যান্স (-আর-মেমরি) -অપ્টিমাইজেশন?


3
আপনি কি "আরও ..." ক্লিক করেছেন? আপনি selfপদ্ধতির ভিতরে কোথাও রেফারেন্স ? (যদি প্রশ্নটি সত্যিই হয় "পাইকার্মের ডিজাইনাররা কেন এটি এভাবে ডিজাইন করেছিলেন ... আপনাকে তাদের জিজ্ঞাসা করতে হবে, তাই না ...)
Wooble

7
@ উবল: return 1পদ্ধতিটির একক লাইন প্রয়োগ রয়েছে। "আরও" তে দরকারী কিছু নেই
জের্কम्स

উত্তর:


188

পাইচার্ম "মনে করে" যে আপনি একটি স্ট্যাটিক পদ্ধতি থাকতে চেয়েছিলেন , তবে আপনি এটি স্থির হিসাবে ঘোষণা করতে ভুলে গেছেন ( @staticmethodসাজসজ্জার ব্যবহার করে )।

পাইচার্ম এটি প্রস্তাব করে কারণ পদ্ধতিটি তার শরীরে ব্যবহার করে না selfএবং তাই প্রকৃতপক্ষে শ্রেণীর উদাহরণটি পরিবর্তন করে না । সুতরাং পদ্ধতিটি অচল হতে পারে, যেমন কোনও শ্রেণীর উদাহরণ পাস না করে বা এমনকি কোনও শ্রেণীর উদাহরণ তৈরি না করে কলযোগ্য।


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

1
এমন কিছু ক্ষেত্রে থাকতে পারে যেখানে পাইকার্মের সতর্কবাণীটি ন্যায়বিচারহীন যে আমরা না কোনও স্থির পদ্ধতি চাই এবং না রাষ্ট্র পরিবর্তন করি। অন্যদিকে, যদি পদ্ধতিটি এখনও প্রয়োগ না করা হয় তবে এটি উত্থাপন করা সর্বদা একটি ভাল ধারণা বলে মনে হয় NotImplementedError
jolvi

3
আমার কেস আছে যে আমার ডিফল্ট বাস্তবায়ন স্থির করে দেয়, তবে আমার সাবক্লাসগুলিকে উপর নির্ভর করে কোনও মান ফেরত দেওয়ার অনুমতি দেওয়া হয় self। এই ক্ষেত্রে সতর্কতা অবহেলাযোগ্য এবং আমি এটি দিয়ে চিহ্নিত করি # noinspection PyMethodMayBeStatic। এটি অত্যন্ত দুঃখের বিষয় যে ইন্টেলিজ আইডিইএ এই সতর্কতার জন্য প্রসঙ্গে মেনুতে এই অক্ষম মন্তব্যটি যুক্ত করার প্রস্তাব দেয় না।
আলফ

আমি পাইকার্মের পছন্দগুলিতে "সতর্কতা" থেকে "কোনও হাইলাইট নয়, কেবল ঠিক করুন" এ এই পাইচর্ম পরিদর্শনটির তীব্রতা পরিবর্তন করার পরামর্শ দিচ্ছি। (এটি আমার জন্য অনেকগুলি মিথ্যা ধনাত্মক
প্রতিক্রিয়া তৈরি করছে ie

51

@ জোলভি, @ অরুন্দাসআর এবং অন্যদের সাথে সম্মত, সতর্কতাটি কোনও সদস্য ফাংশনে ঘটে যা ব্যবহার করে না self

যদি আপনি নিশ্চিত হন যে পাইচার্মটি ভুল, তবে ফাংশনটি একটি হওয়া উচিত নয় @staticmethodএবং আপনি যদি শূন্য সতর্কতার মূল্যকে মূল্য দেন, আপনি এটিকে দুটি ভিন্ন উপায়ে যেতে পারেন:

কার্যবিধি # 1

def bar(self):
    self.is_not_used()
    doing_something_without_self()

def is_not_used(self):
    pass

কার্য # 2 [ধন্যবাদ @ ডেভিডপারসন ]

# noinspection PyMethodMayBeStatic
def bar(self):
    doing_something_without_self()

এর জন্য আমার যে অ্যাপ্লিকেশনটি ছিল (যে কারণে আমি @staticmethod ব্যবহার করতে পারিনি) প্রোটোকল সাব টাইপের ক্ষেত্রে সাড়া দেওয়ার জন্য হ্যান্ডলার ফাংশনগুলির একটি সারণী তৈরি করছিল। সমস্ত হ্যান্ডলারের একই ধরণের কোর্স (স্থির বা ননস্ট্যাটিক) হতে হয়েছিল। কিন্তু কিছু উদাহরণ দিয়ে কিছু করতে ঘটেনি। যদি আমি এই স্ট্যাটিকগুলি তৈরি করে থাকি তবে আমি "টাইপএরর: 'স্ট্যাটিকমেথোথড' অবজেক্টটি কলযোগ্য নয়" get

ওপি এর আতঙ্কিত হয়ে পড়েছিলেন সমর্থনে ইন, পরামর্শ আপনি, staticmethod যখনই আপনি করতে পারেন যোগ পরিপন্থী নীতি তৈরীর একটি পদ্ধতি স্ট্যাটিক এখন এটি কম নিয়ন্ত্রণমূলক করে তোলে, আপনি পারে - এটি সহজ কোড কম পরে নিয়ন্ত্রণমূলক করতে, এটি আরো করতে চেয়ে উদাহরণ.f () এর পরিবর্তে class.f () কল করুন।

এই সতর্কতাটি কেন বিদ্যমান তা অনুমান করে:

  • এটি স্ট্যাটিকমেডোর বিজ্ঞাপন দেয় । এটি বিকাশকারীদের এমন কিছু সম্পর্কে সচেতন করে যা তারা ভালভাবে উদ্দেশ্য করতে পারে।
  • @ জন ওয়ার্লোরের বক্তব্য হিসাবে, নিজের অজান্তে ফাংশনটি থেকে সরে যাওয়ার পরে এটি আপনার দৃষ্টি আকর্ষণ করবে।
  • এটি বস্তুর মডেলটি পুনর্বিবেচনা করার একটি সূত্র; হয়তো ফাংশনটি এই শ্রেণীর অন্তর্ভুক্ত নয়।

1
"একটি স্ট্যাটিক স্ট্যাটিক তৈরি এটি এখন কম সীমাবদ্ধ করে তোলে" --- এটি মোটেও হয় না। উদাহরণস্বরূপ: বহুমুখী পদ্ধতি
জারক্মস

আমি মনে করি শেষ পয়েন্টটি পুনরাবৃত্তি করে: "আপনি কেন এটিকে একটি পদ্ধতি তৈরি করেন, যখন এটি স্পষ্টভাবে একটি কার্যকরী হয়?" স্ট্রাকচারাল স্টাফ থেকে কিছু বিষয় নিয়ে কাজ করে এমন ঘটনাগুলির সত্যই পৃথকভাবে রাখুন। তারপরে আপনি এটিকে সহজেই আলাদা মডিউলে ভাগ করতে পারেন।
hillিল

@ ঝিল বিধিগুলি কোনও যুক্তিসঙ্গত ব্যতিক্রম মনে না করা দিন অবধি সুন্দর জিনিস। আমি একটি বর্ণিত, কলব্যাকের একটি তালিকা।
বব স্টেইন

7
# noinspection PyMethodMayBeStaticপদ্ধতি বা শ্রেণীর উপরে যোগ করা সতর্কতা দমন করে এবং খালি পদ্ধতি বলার চেয়ে আমার মতে ভাল।
ডেভিড পার্সন

1
@ তালা: selfপাইথন 3 তে মোটেও সরানো হয় না।
জুনুক্সেক্স

12

আমি মনে করি যে এই সতর্কতার কারণটি পাইচার্মে কনফিগার করা আছে। আপনি নির্বাচনটি নির্বাচনচিকিত্সা করতে পারেন এডিটর-> পরিদর্শনে স্থির থাকতে পারে


12
আমার প্রশ্ন ছিল কেন এমন পরিদর্শন এমনকি বিদ্যমান। আমি বুঝতে পারি আমি এটি বন্ধ করতে পারি। দুঃখিত, একটি উত্তর না।
zerkms

9

আমি এখানে দেওয়া উত্তরগুলির সাথে একমত (পদ্ধতিটি ব্যবহার করে না selfএবং তাই সজ্জিত হতে পারে @staticmethod)।

আমি যুক্ত করতে চাই যে আপনি ক্লাসের অভ্যন্তরে স্থির পদ্ধতির পরিবর্তে সম্ভবত পদ্ধতিটি একটি শীর্ষ-স্তরের ফাংশনে সরিয়ে নিতে চান। বিশদগুলির জন্য এই প্রশ্ন এবং স্বীকৃত উত্তর দেখুন: অজগর - আমার কি স্থির পদ্ধতি বা শীর্ষ স্তরের ফাংশন ব্যবহার করা উচিত

পদ্ধতিটিকে একটি শীর্ষ-স্তরের ফাংশনে স্থানান্তর করা পাইকার্ম সতর্কতাও ঠিক করে দেবে।


সত্যিই সহায়ক উত্তর - সম্ভবত পাইচার্মের সতর্কতাটির নাম পরিবর্তন করা উচিত 'পদ্ধতিটি স্থির বা শীর্ষ স্তরের ফাংশন হতে পারে' to কোনও পদ্ধতির রিফ্যাক্টর করার সময়, পাইচার্ম selfপ্যারামিটার না হলে একটি শীর্ষ স্তরের ফাংশন তৈরি করবে এবং যাইহোক স্থিতিশীল পদ্ধতি নয়।
সুজনা

সজ্জাকারীর কথা উল্লেখ করার জন্য @ ট্লো +1 আমার একটি পদ্ধতি রয়েছে যা ব্যবহার করে না selfএবং এটি শীর্ষ-স্তরের হতে পারে এমন একটি ক্লাস রয়েছে , তবে এই পদ্ধতিটি কী করে তা দেখার সময় এটি যৌক্তিক মনে হয় না - শীর্ষ স্তরের হিসাবে এটি একটি বিশ্বব্যাপী পদ্ধতির আরও বেশি দেখায়, যদিও এটি রয়েছে প্রকৃতপক্ষে সেই শ্রেণি থেকে তৈরি দৃষ্টান্তগুলির জন্য একটি ছোট সহায়ক সহায়ক। সুতরাং আমার কোডটি যৌক্তিকভাবে সংগঠিত রাখার জন্য, সাজসজ্জাটি হ'ল সঠিক সমাধান।
কাসিমির

7

অবিচলিত হিসাবে সংজ্ঞায়িত একটি শ্রেণিবদ্ধ পদ্ধতি থাকার নিম্নলিখিত সুবিধাগুলি আমি কল্পনা করতে পারি:

  • আপনি ক্লাসের নামটি ব্যবহার করে পদ্ধতিটি কল করতে পারেন, এটি ইনস্ট্যান্ট করার দরকার নেই।

বাকি সুবিধাগুলি সম্ভবত উপস্থিত থাকলে প্রান্তিক:

  • কিছুটা দ্রুত চালাতে পারে
  • মেমরি একটি বিট সংরক্ষণ করুন

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

1
@ জারকামস এইভাবে কিছু মনোমুগ্ধকর উদাহরণগুলির সাথে এটি চলে :-)
জান ভ্লকিনস্কি

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

4

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

সংক্ষেপে, আমি কেন একশো শতাংশ নিশ্চিত নই। আমি অনুমান করছি যে তারা সম্ভবত এটি একটি আসন্ন প্রকাশে সরিয়ে ফেলবে।


3

এই ত্রুটি বার্তাটি আমাকে কেবল একটি গুচ্ছকে সহায়তা করেছিল, কারণ আমি বুঝতে পারি নি যে আমি পরীক্ষার উদাহরণ প্লেয়ারটি ব্যবহার করে ঘটনাক্রমে আমার ফাংশনটি লিখেছি

my_player.attributes[item] 

পরিবর্তে সঠিক উপায়

self.attributes[item]

1

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

যদি আপনার পদ্ধতিতে কেবলমাত্র পার্শ্ব প্রতিক্রিয়া থাকে এবং কী কী পরিবর্তন ঘটে তা আপনার যত্নশীল না করে:

def bar(self):
    doing_something_without_self()
    return self

আপনার যদি ফেরতের মান প্রয়োজন হয়:

def bar(self):
    result = doing_something_without_self()
    if self:
        return result

এখন আপনার পদ্ধতিটি ব্যবহার করছে self, এবং সতর্কতাটি চলে যায়!


0

পাইচার্ম এটিকে কেন একটি সতর্কবার্তা হিসাবে পরিণত করার কারণ কেননা কোনও অচল পদ্ধতিতে (@ স্ট্যাটিকমেডোড যোগ করবেন না) কল করার সময় পাইথন প্রথম যুক্তি হিসাবে নিজেকে অতিক্রম করবে। পাইচার্ম এটা জানে।

উদাহরণ:

class T:
    def test():
        print "i am a normal method!"

t = T()
t.test()
output:
Traceback (most recent call last):
  File "F:/Workspace/test_script/test.py", line 28, in <module>
    T().test()
TypeError: test() takes no arguments (1 given)

আমি জাভা থেকে এসেছি, জাভাতে "স্ব" কে "এটি" বলা হয়, শ্রেণি পদ্ধতিতে আপনার নিজের (বা এটি) লেখার দরকার নেই। আপনার পদ্ধতির ভিতরে যেমন প্রয়োজন তেমন আপনি নিজেকে কল করতে পারেন। তবে পাইথনকে "একটি পদ্ধতি আর্গুমেন্ট হিসাবে স্ব পাস করতে হবে।

এটি বুঝতে পেরে আপনার কাছে @bbStein উত্তর হিসাবে কোনও ওয়ার্কআরাউন্ডের দরকার নেই।


এটা কেটে যায় selfতাই কি?
zerkms

@zerkms '@staticmethod' 'স্ব' পাস করে না
জুনিউ উউ

আমি আপনাকে কেবল উদ্ধৃত করে দিয়েছি: "পাইথন প্রথম যুক্তি হিসাবে স্বতঃস্ফূর্ত হবে ... পাইচার্ম এটি জানে" " তাতে কি? পাইচার্ম এটি জানে, আমি এটি জানি। পদ্ধতি চিহ্নিত করার কারণ কী?
zerkms

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