পাইলেন্ট কর্তৃক অবস্থিত মানগুলিতে লেন (SEQUENCE) ব্যবহারকে কেন ভুল বলে মনে করা হচ্ছে?


211

এই কোড স্নিপেট বিবেচনা:

from os import walk

files = []
for (dirpath, _, filenames) in walk(mydir):
    # more code that modifies files
if len(files) == 0: # <-- C1801
    return None

এই বিবৃতিটির সাথে লাইনটি সম্পর্কে আমি এই বার্তাটি দিয়ে পাইলিন্টকে ভীত করেছিলাম:

[পাইলট] C1801: len(SEQUENCE)শর্ত মান হিসাবে ব্যবহার করবেন না

C1801 নিয়মটি প্রথম নজরে আমার পক্ষে খুব যুক্তিসঙ্গত মনে হয়নি, এবং রেফারেন্স গাইডের সংজ্ঞাটি কেন এটি সমস্যা তা ব্যাখ্যা করে না। আসলে এটি একেবারে ভুল ব্যবহার বলে

লেন-অ-শর্ত (C1801) : শর্ত মান হিসাবে ব্যবহার করবেন না len(SEQUENCE)যখন পাইলিন্ট শর্তের অভ্যন্তরে অবস্থিত লেন (ক্রম) এর ভুল ব্যবহার সনাক্ত করে Used

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

len(SEQ)শর্ত মান হিসাবে ব্যবহার কখন সমস্যাযুক্ত? পাইলেন্ট কোন বড় পরিস্থিতি C1801 এর সাথে এড়াতে চাইছে?


9
কারণ আপনি সরাসরি ক্রমটির সত্যতা মূল্যায়ন করতে পারেন। পাইলট আপনাকে করতে চায় if files:বাif not files:
প্যাট্রিক

38
lenএটি যে প্রসঙ্গে বলা হয়েছে তা জানেন না, সুতরাং দৈর্ঘ্যটি গণনা করার অর্থ যদি পুরো ক্রমটি অতিক্রম করা হয়, অবশ্যই এটি; এটি জানে না যে ফলাফলটি কেবল 0 এর সাথে তুলনা করা হচ্ছে the বুলিয়ান মানটি প্রথম উপাদানটি দেখার পরে থামানো যেতে পারে, ক্রমটি আসলে কত দীর্ঘ of আমি মনে করি পাইলিন্টটি এখানে একটি মতামত হিসাবে অভিহিত করা হচ্ছে; এটি ব্যবহার করা ভুল যেখানে এমন পরিস্থিতি আমি ভাবতে পারি না len, এটি বিকল্পের চেয়ে খারাপ বিকল্প।
চিপনার

2
@ ই_নেট 4 আমি মনে করি পিইপি -8 সম্ভবত এটি শুরু করার জায়গা।
প্যাট্রিক হাহ


6
সিকোয়েনসগুলিতে সি ++ ইমোর মতো একটি 'খালি ()' বা 'ইসেম্পি ()' দরকার।
জেডোনার

উত্তর:


281

len(SEQ)শর্ত মান হিসাবে ব্যবহার কখন সমস্যাযুক্ত? পাইলেন্ট কোন বড় পরিস্থিতি C1801 এর সাথে এড়াতে চাইছে?

এটি ব্যবহার করা সত্যই সমস্যাযুক্ত নয় len(SEQUENCE)- যদিও এটি তেমন দক্ষ নাও হতে পারে ( চেপারারের মন্তব্য দেখুন )। নির্বিশেষে, পাইলিন্ট পিইপি 8 স্টাইল গাইডের সাথে সম্মতির জন্য কোডটি পরীক্ষা করে যা এতে উল্লেখ করে

সিকোয়েন্সগুলির জন্য, (স্ট্রিং, তালিকাগুলি, টিপলস) খালি সিকোয়েন্সগুলি মিথ্যা রয়েছে তা ব্যবহার করুন।

Yes: if not seq:
     if seq:

No:  if len(seq):
     if not len(seq):

একটি অনিয়মিত পাইথন প্রোগ্রামার হিসাবে, যিনি ভাষার মাঝে উড়ে বেড়াচ্ছেন, আমি এই নির্মাণটিকে len(SEQUENCE)আরও পাঠযোগ্য এবং স্পষ্ট করে বিবেচনা করব ("স্পষ্টিকর আরও ভাল তবে অন্তর্নিহিত")। তবে, Falseএকটি বুলিয়ান প্রসঙ্গে খালি সিক্যুয়েন্সটি যে মূল্যায়ন করে তা ব্যবহার করে আরও "পাইথোনিক" হিসাবে বিবেচনা করা হয়।


তাহলে এই কাজটি কীভাবে করা যায়:if len(fnmatch.filter(os.listdir(os.getcwd()), 'f_*')):
মেরিচ্যাশানা

@ মেরিচায়সানা আমি অনুমান করি যে এই জাতীয় জিনিসগুলি (তাত্ত্বিকভাবে) হিসাবে লেখা if next(iter(...), None) is not None:যেতে পারে (যদি ক্রমটি থাকতে পারে না None)। এটি দীর্ঘ, তবে len(fnmatch...)দীর্ঘও; উভয় বিভক্ত করা প্রয়োজন।
কিরিল বুলিগিন

13
আমি একটি আকস্মিক পাইথন ব্যবহারকারী এবং প্রায়শই আমার ধারণা হয় যে "পাইথোনিক ওয়ে" এর নিজস্ব অস্পষ্টতার মধ্যে একধরনের জঞ্জাল হয়ে পড়েছে।
luqo33

3
কেবল একটি সাধারণ প্রশ্ন, এই পিইপি সুপারিশগুলি কি সংশোধন করা যেতে পারে? len(s) == 0আমার মতে চূড়ান্ত হওয়ার আরেকটি কারণ হ'ল এটি অন্যান্য ধরণের ক্রমগুলির জন্য জেনারাইজড iz উদাহরণস্বরূপ, pandas.Seriesএবং অদ্ভুত অ্যারে। if not s:অন্যদিকে নয়, এবং সেক্ষেত্রে আপনাকে সম্ভাব্য সমস্ত ধরণের অ্যারে-জাতীয় বস্তুর (যেমন pd.DataFrame.empty) আলাদা আলাদা মূল্যায়ন করতে হবে ।
মঙ্গল মঙ্গল

2
যাইহোক, কোনও of collections.abcশ্রেণিই __bool__পদ্ধতিটি নির্দেশ করে না । অন্য কথায়, আমি কীভাবে নিশ্চিত যে আমি এটি ব্যবহার করতে পারি তা bool(seq)যদি আমি জানতে পারি যে এটি একটি collections.abc.Collection? মোরেসো, কিছু পাঠাগারগুলি অস্বীকার করে যে এটি bool(collection)তাদের ক্লাসগুলির জন্য পরীক্ষা করা নিষিদ্ধ ।
ইয়ার নিম

42

মনে রাখবেন যে NumPy অ্যারে ব্যবহার করার সময় লেন (সেক) ব্যবহারের প্রয়োজন হয় (সেকের কেবলমাত্র বুলি মূল্য পরীক্ষা করার পরিবর্তে)।

a = numpy.array(range(10))
if a:
    print "a is not empty"

ব্যাতিক্রমের ফলাফল: ভ্যালুএররার: একাধিক উপাদান সহ একটি অ্যারের সত্য মান দ্বিধাগ্রস্ত। A.any () বা a.all () ব্যবহার করুন

এবং তাই পাইথন তালিকাগুলি এবং নম্পপি অ্যারে উভয়ই ব্যবহার করে এমন কোডের জন্য, C1801 বার্তা সহায়কের চেয়ে কম নয়।


5
আমি আপনার বিবৃতি সাথে একমত। # 1405 ইস্যুটি এখন উত্থাপিত হওয়ার সাথে সাথে আশা করছি C1801 হয় কার্যকর কিছুতে রূপান্তরিত হয়েছে বা ডিফল্টরূপে অক্ষম হয়েছে।
ই_নেট

2
আরও যদি ক্রমটিতে একটি নির্দিষ্ট সংখ্যক উপাদান রয়েছে কিনা তা যাচাই করার জন্য এটি অকেজো। এটি যাচাইয়ের জন্য এটি কেবল ভাল এটি সর্বোত্তম ক্ষেত্রে এটি সম্পূর্ণ শূন্য।
পাবটোরে

1

এটি পাইলটে একটি সমস্যা ছিল এবং এটি আর len(x) == 0ভুল হিসাবে বিবেচনা করে না ।

শর্ত হিসাবে আপনার খালি ব্যবহার করা উচিত নয় len(x)। তুলনা len(x)যেমন একটি সুনির্দিষ্ট মান বিরুদ্ধে if len(x) == 0এর if len(x) > 0সম্পূর্ণই সূক্ষ্ম এবং PEP 8 দ্বারা নিষিদ্ধ করা হয়।

পিইপি 8 থেকে :

# Correct:
if not seq:
if seq:

# Wrong:
if len(seq):
if not len(seq):

দ্রষ্টব্য যে স্পষ্টভাবে দৈর্ঘ্যের জন্য পরীক্ষা করা নিষিদ্ধ নয়। Python- র জেন বলে:

সুস্পষ্ট বর্ণিত চেয়ে ভাল।

মধ্যে পছন্দমত মধ্যে if not seqএবং if not len(seq)উভয় অন্তর্নিহিত কিন্তু আচরণ ভিন্ন। তবে if len(seq) == 0বা if len(seq) > 0সুস্পষ্ট তুলনা এবং অনেক প্রসঙ্গে সঠিক আচরণ।

পাইলট ইন, PR 2815 এই বাগটি ঠিক করেছে, প্রথমে 2684 ইস্যু হিসাবে রিপোর্ট করা হয়েছে । এটি সম্পর্কে অভিযোগ অবিরত থাকবে if len(seq), তবে এটি আর অভিযোগ করবে না if len(seq) > 0। পিআরটি 2019-03-19 একীভূত হয়েছিল তাই আপনি যদি পাইলট ২.৪ ব্যবহার করেন (2019-09-14 প্রকাশিত হয়েছে) আপনার এই সমস্যাটি দেখা উচিত নয়।


0

পাইলট আমার কোডটির জন্য ব্যর্থ হয়েছিল এবং গবেষণা আমাকে এই পোস্টে নিয়ে গেছে:

../filename.py:49:11: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition)
../filename.py:49:34: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition)

এটি আগে আমার কোড ছিল:

def list_empty_folders(directory):
"""The Module Has Been Build to list empty Mac Folders."""
for (fullpath, dirnames, filenames) in os.walk(directory):
    if len(dirnames) == 0 and len(filenames) == 0:
        print("Exists: {} : Absolute Path: {}".format(
            os.path.exists(fullpath), os.path.abspath(fullpath)))

এটি আমার কোড ফিক্সের পরে ছিল। এটি ব্যবহার করে int() attribute, আমি মনে করি পেপ 8 / পাইলিন্ট সন্তুষ্ট হয়ে গেছে এবং আমার কোডে নেতিবাচক প্রভাব আছে বলে মনে হচ্ছে না:

def list_empty_folders(directory):
"""The Module Has Been Build to list empty Mac Folders."""
for (fullpath, dirnames, filenames) in os.walk(directory):
    if len(dirnames).__trunc__() == 0 and len(filenames).__trunc__() == 0:
        print("Exists: {} : Absolute Path: {}".format(
            os.path.exists(fullpath), os.path.abspath(fullpath)))

আমার ফিক্স

যোগ করে .__trunc__()ক্রম তা প্রয়োজন বসতি স্থাপন করে আছে বলে মনে হয়।

আমি আচরণের মধ্যে কোনও পার্থক্য দেখতে পাচ্ছি না, তবে যদি কেউ আমার অনুপস্থিত যে সুনির্দিষ্ট জানেন তবে দয়া করে আমাকে জানান।


1
আপনি __trunc__()আউটপুটটিতে কল করছেন len(seq)যা (কিছুটা অপ্রয়োজনীয়ভাবে) দৈর্ঘ্যের মানটিকে একটি পূর্ণসংখ্যায় ছাঁটাই করে দেয়। এটি কেবল পিছনে পিছনে কারণগুলিকে সম্বোধন না করেই "ছোঁয়া" দেয়। গৃহীত উত্তরের পরামর্শটি আপনার পক্ষে কার্যকর হয়নি?
E_net4

আমার চেষ্টায় নয় আমি রিডানডেন্সিটি বুঝতে পারি, তবে এই সমস্যাটি বিকাশকারীরা github.com/PyCQA/pylint/issues/1405 & 2684 তে সম্বোধন করার পরেও মিশে গেছে, আমার বুঝতে পাইলট চালানোর সময় এটি কোনও সমস্যা হওয়া উচিত নয় তবে আমার পাইলট আপডেট করার পরেও আমি এই সমস্যাটি দেখতে পাচ্ছি। আমি কেবল ভাগ করে নিতে চেয়েছিলাম this worked for me, যদিও এটি সম্পূর্ণ উপযুক্ত না হয়। তবে, লেন (সেক) == 0 তুলনা করলে তা অপ্রয়োজনীয় কিনা তা স্পষ্ট করার জন্য ট্রাঙ্ককে কিছু করতে হবে না কারণ তারা ইতিমধ্যে পূর্ণসংখ্যা হিসাবে রয়েছে। ঠিক আছে?
জয়রিজ্জো

1
হুবহু, এটি ইতিমধ্যে একটি পূর্ণসংখ্যার, এবং __trunc__()অর্থবহ কিছু করে না। নোট করুন যে আমি তুলনাটিকে অপ্রয়োজনীয় বলে উল্লেখ করি নি, তবে দৈর্ঘ্যটি কেটে ফেলার চেষ্টা করেছি। সতর্কতাটি কেবল অদৃশ্য হয়ে যায় কারণ এটি কেবল ফর্মের একটি অভিব্যক্তি প্রত্যাশা করে len(seq) == 0। আমি বিশ্বাস করি যে এই ক্ষেত্রে if not dirnames and not filenames:
লিঙ্কটি আপনি

সত্যতার জন্য পরীক্ষার যদি __bool__ফাংশন অন্তর্নিহিত ক্রমটিতে সংজ্ঞায়িত না হয় তবে "সর্বদা সত্য" হওয়ার অযৌক্তিক পরিণতি হয় ।
এরিক অ্যারোনস্টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.