পাইচার্ম ইন্সপেক্টর কেন "d = {}" সম্পর্কে অভিযোগ করেন?


195

d = {}পাইচার্মের কোড পরিদর্শকের সাথে অভিধানের সূচনা করার সময় একটি সতর্কতা উত্পন্ন করে বলে

এই অভিধান তৈরির অভিধানটি আক্ষরিক হিসাবে আবারও লেখা যেতে পারে।

আমি এটি d = dict()আবার লিখলে সতর্কতা চলে যায় goes যেহেতু {}ইতিমধ্যে হয় একটি অভিধান আক্ষরিক, আমি সুন্দর নিশ্চিত বার্তা ভ্রান্ত হয়। তদ্ব্যতীত, এটি উভয়ের মতোই মনে হয় d = {}এবং d = dict()এটি বৈধ এবং পাইথোনিক।

এই সম্পর্কিত প্রশ্নটি এই সিদ্ধান্তে পৌঁছেছে যে পছন্দটি কেবল স্টাইল / পছন্দসই বিষয়: "ডি = ডিক ()" এবং "ডি = {}" এর মধ্যে পার্থক্য

পাইচার্ম কেন অভিযোগ করবে d = {}?

হালনাগাদ:

ম্যাক এটিকে পেরেক দিয়েছিল। সতর্কতাটি কেবল একাধিক লাইনে প্রয়োগ হয়েছিল, কেবল যেটিকে পতাকাঙ্কিত করা হয়েছিল তা নয়।

পাইচার্ম ধারাবাহিক বিবৃতিগুলির অনুক্রমের সন্ধান করছে বলে মনে হচ্ছে যেখানে আপনি একটি অভিধান শুরু করেন এবং অভিধানে মান নির্ধারণ করেন। উদাহরণস্বরূপ, এটি সতর্কতা ট্রিগার করবে:

d = {}
d['a'] = 1

তবে এই কোডটি করবে না:

d = {}
pass
d['a'] = 1

2
খুব গোলমাল, এবং কোনও আসল পারফরম্যান্স লাভ নেই, কেবল আরও একটি
অতিমাত্রায়

তালিকার ক্ষেত্রে একই জিনিস ঘটে: a = [1]; a.append (2), সম্ভবত কারণ a = [1, 2] খুব ভাল ....
ক্লারোস

হা. বিরক্তিকর বার্তা পাইচার্মের দ্বারা আন্ডারলাইন করা সমস্তগুলি প্রোগ্রামটি সঞ্চালনের আগে অস্বস্তি করে তোলে।
রাজকুমার আর

আমি জেটব্রেইন্স ইউট্র্যাক- তে একইরকম সমস্যা পেয়েছি - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326 এবং এতে বলা হয়েছে: এই ক্ষেত্রে পাইচার্ম পরামর্শ দেয় যে আপনি something এট্রিবিউটের জন্য ডিক্সের ক্ষেত্রে ড্যাটারেলটির পরিবর্তে মানটি সরবরাহ করতে পারবেন। পরের লাইনে
দুডনিকফ

উত্তর:


244

আপনার অভিধান ঘোষণার জন্য নিম্নলিখিত কোডটি কী?

আমি মনে করি পাইচার্ম ত্রুটিটি ট্রিগার করবে যদি আপনার মতো কিছু থাকে:

dic = {}
dic['aaa'] = 5

আপনি লিখতে পারে হিসাবে

dic = {'aaa': 5}

বিটিডাব্লু: আপনি যদি ফাংশনটি ব্যবহার করেন তবে ত্রুটিটি চলে যায় এমন অর্থ এই নয় যে পাইচার্ম বিশ্বাস করে যে dict()এটি আক্ষরিক। এর অর্থ কেবল এটিই হতে পারে যে এটি অভিযোগ করে না:

dic = dict()
dic['aaa'] = 5

আছে HTH!


6
স্পষ্টতই এটি এই সমস্ত অ-দরকারী শোরগোল পরিদর্শনগুলির জন্য দুর্ভাগ্যক্রমে আমার কিছু সহকর্মীরা একেবারে এটি বন্ধ করে দেয়, এটি লজ্জাজনক কারণ এটি পিইপি, ..., বাস্তব সমস্যা এবং বাস্তব পারফরম্যান্স ইঙ্গিতগুলির মতো অনেক কিছুর জন্য কার্যকর is
ড্যাশসি

আমার ক্ষেত্রে এ জাতীয় পুনর্লিখন সম্ভব নয়, যেহেতু প্রতিটি অভিধান আইটেম তৈরি হয়েছে (তবে প্রথমটি) তৈরি করা পূর্ববর্তী অভিধানের আইটেমের উপর নির্ভর করে। সুতরাং তাদের একই সাথে প্রতিটি আইটেমের পরিবর্তে অভিধানে অর্পণ করতে হবে। তবে পাইচার্ম এখনও অভিযোগ করে এবং বলেছে যে আমার অভিধান অভিধানকে আক্ষরিক হিসাবে তৈরি করা উচিত। আমি অনুমান করি যে আমাকে dic = dict()
কাজটি

@ হেলো গুডবাই - আপনি যে সমস্যাটি সমাধান করার চেষ্টা করছেন তা না জেনে আমি একটি যোগ্য মতামত প্রকাশ করতে পারব না, তবে আপনি কি d = { 'aaa': f1(something) }তখন d = f2(d)থেকেই d = f3(d)ইত্যাদি শুরু করার কথা বিবেচনা করেছেন ... বা বিকল্পভাবে d['bbb'] = f2(d), d['ccc'] = f3(d)...?
ম্যাক

নির্মাণ আমি আছে d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b'])ইত্যাদি,
HelloGoodbye

5
@ হেলো গুডবি - সুতরাং, কেন প্রথম দুটি সাথে একত্রীকরণ করবেন না d = {'a': A}এবং তারপরে আপনার বর্ণনাকে ঠিক ঠিক অনুসারে রাখবেন?
ম্যাক

15

এটি প্রকল্প সেটিংস বা ডিফল্ট সেটিংসে অক্ষম করা যেতে পারে।

  • সেটিংস -> পরিদর্শন -> পাইথনে নেভিগেট করুন
  • আনচেক করুন "অভিধানের রচনার অভিধান অভিধানটি আবার লিখিত হতে পারে"

এটিই আমি করেছি এবং এটি ভালভাবে কাজ করছে তা নিশ্চিত করতে পারি। আমার কোডটি ছিল: পেলোড = {** বেসপায়লড, ** এক্সট্রাপায়লোড two দুটি অভিধানকে একত্রিত করতে এবং এটি ত্রুটি ছুঁড়ে দিচ্ছিল।
pa1983

9

যারা (যেমন আমার মত) একক ক্রিয়াকলাপ দিয়ে অভিধান শুরু করতে চান তাদের জন্য

d = {
  'a': 12,
  'b': 'foo',
  'c': 'bar'
}

পরিবর্তে অনেক লাইনের মত

d = dict()
d['a'] = 12
d['b'] = ....

শেষ পর্যন্ত আমি এটি দিয়ে শেষ করেছি:

d = dict()
d.update({
  'a': 12,
  'b': 'foo',
  'c': 'bar'
})

পাইচার্ম এ নিয়ে অভিযোগ করছে না


7
আমি কুঁকড়ে :( সুতরাং, আপনি আসলে কোডের পরিমাণ বাড়িয়েছেন এবং আপনি যে সম্পাদকীয় ব্যবহার করেছেন এমন সতর্কবার্তা থেকে মুক্তি পেতে এটিকে কম স্পষ্ট এবং ধীর করে চলছে ... আমি পাইচার্ম ব্যবহার করি না, তবে আমি ধরে নেব যে কিছু আছে ধরণের কনফিগারেশন টগল যা সতর্কতাটি অক্ষম করবে এবং আপনাকে অজগর উপায়ে কোডিং চালিয়ে যাওয়ার অনুমতি দেবে :) :)
ম্যাক

2
@ ম্যাক আমি এখন একমত। আমি তখন থেকে তরুণ এবং বোকা) তখন থেকে আমি (কিছুটা) পরিবর্তন করেছি এবং কেবল এই সতর্কতাগুলি অক্ষম করেছি
ইগোর.কে

হাঃ হাঃ হাঃ! এটি অবশ্যই আমি সবচেয়ে স্মরণীয় টাইম অফসেট মন্তব্য পেয়েছি! ;)
ম্যাক

0
mydict = {
  a: 5,
  b:z+c/2
}

অভিধানটি প্রথমে এগুলি আরম্ভ না করে এবং পরে নতুন মানগুলি পুনরায় স্বাক্ষর না করেই তৈরি করা যেতে পারে।


0

আমার এমন একটি পরিস্থিতি রয়েছে যেখানে এই সতর্কতাটি আমার থেকে নরকে ডেকে আনে। আমার ক্ষেত্রে, আমি আমার ডিককে আংশিকভাবে আক্ষরিক হিসাবে এবং আংশিকভাবে একটি ফাংশন দ্বারা একটি tuple আউটপুট থেকে পপুলেট করছি:

def get_other_values():
    return 3, 4

foo = {
    "a": 1,
    "b": 2
}
foo["c"], foo["d"] = get_other_values()

সুতরাং, যতক্ষণ না আমি get_other_values ​​আউটপুট জন্য অন্তর্বর্তী vars তৈরি না করে, PEP8 এই সতর্কতা জেনারেট করে যদিও আমি আক্ষরিক সাথে ডেক তৈরি করছি। এবং আমি আক্ষরিক সি এবং ডি কীগুলি বরাদ্দ করতে পারি না, যেহেতু মানগুলি টিপল হিসাবে আউটপুট হয়।

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