পাইথন ফাংশন কলটিতে অব্যবহৃত রিটার্ন পরামিতিগুলির জন্য কোন স্টাইলটি ব্যবহার করতে হবে


30

পরিস্থিতি পরিচালনার জন্য কি কোনও প্রস্তাবিত / সাধারণভাবে গৃহীত কোডিং স্টাইল রয়েছে যেখানে কোনও ফাংশন মানগুলির একটি দ্বিগুণ ফিরিয়ে দেয় তবে সেই মানগুলির মধ্যে একটির পরে ব্যবহার করা হয় (নোট করুন এটি বেশিরভাগ গ্রন্থাগারের ফাংশনগুলির জন্য যা আমি পরিবর্তন করতে পারি না - চারপাশে মোড়ক লেখা) কলটি সম্ভবত কিছুটা ওভারকিল…)? পরিবর্তে না

a, b, c = foo()

এবং তারপরে কেবল ব্যবহার না করে bএবং cনিম্নলিখিত নীচের কোনটি পছন্দ করা উচিত (বা অন্য কোনও আছে?):

বৈকল্পিক 1 (আন্ডারস্কোর)

a, _, _ = foo()

(যা খুব স্পষ্ট এবং সাধারণ তবে _ = gettext.gettextঅনুবাদ ব্যবহারকারী অনেক অ্যাপ্লিকেশনে ব্যবহৃত সংঘর্ষের সাথে সংঘটিত হতে পারে )

বৈকল্পিক 2 (ডামি নাম)

a, unused, unused = foo()

(খুব আবেদনকারী নয়, আমি মনে করি, অন্য নামের মতোও এটি হয় dummy)

বৈকল্পিক 3 (সূচক)

a = foo()[0]

(আমার কাছে ()[0]দেখতে অ-পাইথোনিক লাগছে ...)


এটি আমার পূর্ববর্তী উত্তরের বিপরীতে, যখন আপনি এখন ফেরতের মানগুলির 2/3 উল্লেখ করতে চান তখন 3 রূপের সাথে কী ঘটে? আমি আমার উত্তরটি সরিয়ে দিয়েছি কারণ আমি বুঝতে পেরেছিলাম পাইথনকে ন্যায়সঙ্গত করার পক্ষে আমি যথেষ্ট জানিনা।
ক্রেইজ

@ ক্রেইগ: আপনার উত্তর সরিয়ে দেওয়ার আগে আমি তা দেখিনি ... আপনি কি জিজ্ঞাসা করছেন a, b = foo()[0:2]কাজ করবে কিনা ? যদি হ্যাঁ: হ্যাঁ, এটি হয় :)
ব্যবহারকারিক 4964643

আমি যা বলছিলাম ঠিক সেটাই ছিল। যদি এটি কাজ করে (যেমনটি আপনি বলেছিলেন) আমি ভেরিয়েন্ট ৩ ব্যবহার করব I'm আমি এই তথ্যটি দিয়ে আমার উত্তরটি পুনরায় ইনস্টল করছি।
ক্রেইজ

3
ঘটনাচক্রে, এই দিনগুলিতে আপনি 'বর্ধিত' আনপ্যাকিংয়ের জন্য বরং সুন্দর সিনট্যাক্সটি ব্যবহার করতে পারেন : a, *_ = foo()প্রথমটি বাদ দিয়ে সমস্ত মান ফেলে দেবে।
বেনিয়ামিন হজসন

উত্তর:


17

অব্যবহৃত ভেরিয়েবলের জন্য আন্ডারস্কোর ব্যবহার অবশ্যই গ্রহণযোগ্য। যদিও সতর্ক, কিছু codebases এটা একটি বিকল্প হিসাবে শনাক্তকারীর জন্য সংক্ষেপে সংরক্ষিত নয় gettext। এটি এই স্টাইলে সবচেয়ে ঘন ঘন আপত্তি (যদিও এটি সংখ্যাগরিষ্ঠের পক্ষে আমি বিচার করতে পারি না)। আমি এখনও এটি সুপারিশ করব এবং সর্বদা এটি নিজেই ব্যবহার করব।

এর মতো নামগুলি dummyবা unusedআমাকে ব্যক্তিগতভাবে জ্বালাতন ঝোঁক, এবং আমি তাদেরকে ভয়ঙ্কর প্রায়ই দেখতে পাই না (পাইথন এ, যে - আমি একটি ডেল্ফী কোডবেস যা ব্যবহার জানেন dummyঅকুণ্ঠচিত্তে, এবং এটা প্রশ্নে প্রোগ্রামের সাথে যুক্ত স্ক্রিপ্ট মধ্যে ফাঁস হয়েছে)। আমি আপনাকে এর বিপরীতে পরামর্শ দেব।

ফিরে আসা টিপল থেকে কেবল একটি আইটেম আহরণ করা ঠিক আছে। অব্যবহৃত মানগুলির সংখ্যা সঠিক হওয়ার সাথে এটি কিছু ঝামেলাও বাঁচায়। যদিও এটির দুটি সম্ভাব্য ডাউনসাইড রয়েছে তা দ্রষ্টব্য:

  • মানগুলির সংখ্যাটি আপনার প্রত্যাশার চেয়ে আলাদা হলে এটি ফুটে ওঠে না। এটি মিক্সআপ এবং টাইপগুলি সনাক্ত করতে কার্যকর হতে পারে।
  • এটি কেবল তখনই কার্যকর হয় যখন রিটার্ন মান একটি ক্রম হয় (এটি বেশিরভাগ টিপলস এবং তালিকাগুলি থাকে তবে আসুন সাধারণ থাকি)। অফহ্যান্ড, আমি আমার কোডে একটি শ্রেণি জানি (একটি 2 ডি ভেক্টর) যা পুনরাবৃত্তিযোগ্য এবং ধ্রুব সংখ্যক মান দেয় (এবং এই পদ্ধতিটি আনপ্যাকিংয়ে ব্যবহার করা যেতে পারে), তবে সূচকযোগ্য নয়।

আমি হয়নি আসলে আমার প্রশ্নে gettext উল্লেখ :) যাই হোক, আমি আপনার উত্তর গৃহীত - এটা মনে হয় কোন স্পষ্ট একক গৃহীত শৈলী আছে কিন্তু আপনার উত্তর কিছু মজার বিষয় উত্থাপিত।
ব্যবহারকারী 49643

গেটেক্সটেক্সের সমস্যাগুলি এড়াতে (বা দোভাষীর অনুরূপ সমস্যা এড়াতে) আপনি এককটির পরিবর্তে ডাবল আন্ডারস্কোর (ওরফে ডন্ডার) ব্যবহার করতে পারেন।
জিম

21

পাইলিন্টটি এভাবে করার অভ্যাসে আমাকে পেয়েছে:

widget, _parent, _children = f()

তা হল, অব্যবহৃত ফলাফলগুলির বর্ণনামূলক নাম _ দ্বারা উপস্থাপিত হয়েছে। পাইলিন্ট _কে অব্যবহৃত হিসাবে উপস্থাপিত স্থানীয় এবং গ্লোবাল বা বৈশিষ্ট্যগুলি _ হিসাবে ব্যক্তিগত হিসাবে _ হিসাবে উপস্থাপিত হিসাবে গণ্য করে।


3

যদি আপনার পুরো প্রকল্পে, আপনি এটি কেবল একবারই করছেন বা খুব কমই নির্দিষ্ট ফাংশনটি আঁকছেন, আপনি যদি জানেন gettextযে মডিউলটিতে কোনও সমস্যা না হয় এবং অন্যথায় ভেরিয়েন্ট 3।

অন্যদিকে, আপনি যদি এটি অনেক কিছু করে যাচ্ছেন - এবং বিশেষত প্রতিবার আপনি যদি রিটার্ন মানগুলির একটি আলাদা উপসেট চান (কেবল আপনার অভাবনীয় বিষয়গুলির যত্ন নেওয়ার জন্য একটি মোড়ক তৈরি করা) তবে মোড়কের লিখনটি উপকারী হতে পারে যা ফলাফলগুলিকে একটি নামযুক্ত টিপল বা অন্য কোনও বর্ণনামূলক শ্রেণীর উদাহরণ দেয়, যা আপনাকে করতে দেয়:

bar = foo()

এবং তারপরে কাজ করুন bar.a, bar.bএবং bar.c


2

অন্যরা যেমন বলেছে, আন্ডারস্কোর ( _) হ'ল মান। তবে যদি অনুবাদগুলির জন্য আন্ডারস্কোর ব্যবহার করা হয় তবে আমি মনে করি ডাবল আন্ডারস্কোরই সেরা বিকল্প।

var, __, value = "VAR=value".partition('=')

এর থেকে ভাল:

var, unused, value = "VAR=value".partition('=')

var, unused_del, value = "VAR=value".partition('=')

var, _del, value = "VAR=value".partition('=')


1

আমি একটি পাইথন প্রোগ্রামার না, তবে আমার কাছে তৃতীয় রূপটি সবচেয়ে বেশি অর্থবোধ করে।

বৈকল্পিক 3 এ আপনি একেবারে স্পষ্ট যে কোনটি মূল্যায়নের জন্য আপনার আগ্রহী। ভেরিয়েন্ট 1 এবং 2 তে, আপনি ভ্যারিয়েবলগুলিতে ফিরে মানগুলি অর্পণ করছেন এবং এইভাবে সেগুলি ব্যবহার করা যেতে পারে। আপনি এগুলির নাম অস্পষ্টভাবে রেখে থাকতে পারেন, তবে খারাপ নামকরণ আসলেই কোনও সমস্যার সমাধান নয়।

স্পষ্টতা বাদে, আপনি কেন মেমোরির একটি স্লটে অব্যবহৃত মানগুলি বরাদ্দ করতে চান (যেমন ভেরিয়েন্ট 1 এবং 2)? এটি মেমরি পরিচালনার ক্ষেত্রে একটি দুর্বল সমাধান হতে পারে।


আপনি যদি সর্বদা এটি একই ভেরিয়েবলের উপরে রাখেন তবে স্মৃতি সমস্যাটি কোনও নির্দিষ্ট সময়ে কেবল একটি একক ভেরিয়েবলের আকার হতে পারে না? আমি মনে করি না যে এটি একটি সমস্যা হওয়া উচিত।
মাইকেল ম্যাকক্যায়েড

-2

এখানে একটি সাধারণ নিয়ম: প্রত্যাবর্তিত মানগুলির মধ্যে কেবল 1 টি ব্যবহৃত হয়, তবে কেন কেবল সেই 1 মানটি ফেরৎ দেওয়া হবে না? একাধিক জায়গা থেকে পতাকা আহ্বানের ক্ষেত্রে, একই জন্য একটি পতাকা রাখুন এবং পতাকা অনুসারে মানগুলি ফেরত দিন।

সম্পাদনা করুন:

যদি আমি আপনার পরিস্থিতিতে ছিলাম, এবং আমি ফাংশনটি লিখিনি, আমি সম্ভবত ভেরিয়েন্ট ২-এর জন্য যাব, আমি সেখানে ডামি নাম রাখব যাতে প্রয়োজনের ক্ষেত্রে পরামিতিগুলি ব্যবহার করা যায়। তালিকাটি কাটাতে কিছুটা ওভারহেড থাকবে। অবাঞ্ছিত ডেটা পেতে সম্ভবত আপনি কয়েকটি বাইট ছাড়তে পারেন।


-1 আমি অনুমান করছি যে তিনি ফাংশনটি সংজ্ঞায়িত করেন নি, এবং এটি কী ফিরিয়ে দেয় তা পরিবর্তন করতে পারে না। আমি মনে করি ফাংশনটি যখন 3 টি মান দেয় তখন তিনি উল্লেখ করছেন তবে তিনি তার বর্তমান ব্যবহারের ক্ষেত্রে কেবল 1 টি যত্নশীল।
ক্রেইজ

@ ক্রেইগ: হ্যাঁ, আমি বোঝাতে চাইছি যে ক্রিয়াকলাপগুলি আমি পরিবর্তন করতে পারছি না - আমি আমার প্রশ্নের সাথে একটি নোট যুক্ত করে তা স্পষ্ট করে বলছি।
ব্যবহারকারী 49643

আপনি কি ওভারহেড সম্পর্কে নিশ্চিত? আমি একটি খুব সাধারণ আইপথন পরীক্ষার চেষ্টা করেছি: %timeit a, _, _ = foo()বনাম। %timeit a = foo()[0]যার ফলস্বরূপ 123ns বনাম 109ns হয়েছে, অর্থাত স্লাইসিংটি মান আনপ্যাকিংয়ের চেয়ে আসলে দ্রুততর বলে মনে হচ্ছে। নাকি আপনার কোনও নির্দিষ্ট পরিস্থিতি মনে আছে?
ব্যবহারকারী 49643

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