আমার ধ্রুবকগুলির জন্য কি সত্যই সমস্ত বড় হাতের ব্যবহার করা উচিত?


34

আমি পাইথন প্রোগ্রামার মূলত যারা সোর্স কোডটি আবদ্ধ করার জন্য পাইলট ব্যবহার করে। আমি এক ব্যতীত সমস্ত সতর্কতা দূর করতে সক্ষম: একটি ধ্রুবকের জন্য অবৈধ নাম। নামটি সমস্ত ক্যাপগুলিতে পরিবর্তন করা এটি ঠিক করে দেয় তবে আমার কি সত্যিই এটি করার কথা আছে? যদি আমি এটি করি, আমি দেখতে পেলাম যে আমার কোডটি বেশিরভাগ ভেরিয়েবল ধ্রুবক হিসাবে পাইলট দেখাচ্ছে (পাইলট অনুসারে)।


2
যদি আপনার বেশিরভাগ ভেরিয়েবলগুলি মডিউল স্তরের ধ্রুবক হয় তবে আপনি সম্ভবত অস্বাভাবিক কিছু করছেন। তাদের বেশিরভাগের ভিতরে ফাংশন থাকা উচিত।
রিমকো গ্রিলিচ

1
আপনি কি আমাদের আপনার কোডের একটি নমুনা দেখাতে পারেন যা পাইলটটি ধ্রুবক হিসাবে মনে করে?
উইনস্টন ইওয়ার্ট

@ উইনস্টনওয়ার্টNOTES_DIRECTORY = argv[1] chdir(NOTES_DIRECTORY) FILES = glob('*.txt') RAND_FILE = choice(FILES) with open(RAND_FILE) as notes_file: POINTS = notes_file.readlines() RAND_POINT = choice(POINTS)
অভিষেক কুমার

@ অভিষেককুমার, আপনার কোডটি কোনও ফাংশনে, না শীর্ষ স্তরে?
উইনস্টন ইওয়ার্ট

@ উইনস্টনওয়ার্ট শীর্ষ স্তরে এবং পাইলিন্টের নির্দেশ অনুসরণ করার পরে।
অভিষেক কুমার

উত্তর:


33

আপনি সম্ভবত এই জাতীয় কোড লিখছেন:

notes_director = argv[1]
chdir(notes_director)
files = glob('*.txt')
rand_file = choice(files)
with open(rand_file) as notes_file: 
    points = notes_file.readlines() 
    rand_point = choice(points)

আপনার এই কোডটি কোনও ক্রিয়ায় সরানো উচিত:

def main():
    notes_director = argv[1]
    chdir(notes_director)
    files = glob('*.txt')
    rand_file = choice(files)
    with open(rand_file) as notes_file: 
        points = notes_file.readlines() 
        rand_point = choice(points)

# actually call the main function    
main()

পাইলিন্ট অনুমান করে যে কোডটি আসলে কাজটি করে কোনও ফাংশনের অভ্যন্তরে। কারণ আপনার কোনও কোডের অভ্যন্তরের পরিবর্তে আপনার কোডের শীর্ষ স্তরে এই কোডটি বিভ্রান্ত হয়ে পড়ে।

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


1
দৃr়ভাবে অসম্মতি, আমি মনে করি মডিউল স্তরের ভেরিয়েবলগুলি ব্যবহার করার অনেকগুলি ভাল পাইথোনিক কারণ রয়েছে। আমি মনে করি যে এই পরামর্শটি কেবল পাইলটকে ভুলভাবে পড়ার PEP8 এর একটি নিদর্শন, এবং "ধ্রুবকগুলি মডিউল স্তর হওয়া উচিত" এর কথোপকথনটিও সত্য হওয়া উচিত um
মেট্রিক সিস্টেম

21

হ্যাঁ। ধ্রুবকগুলিতে পিইপি 8 এর বিধি অনুসারে :

ধ্রুবকগুলি সাধারণত একটি মডিউল স্তরে সংজ্ঞায়িত হয় এবং আন্ডারস্কোর পৃথক শব্দের সাথে সমস্ত মূল অক্ষরে লেখা হয়। উদাহরণ অন্তর্ভুক্ত MAX_OVERFLOWএবং TOTAL

দীর্ঘ সংস্করণ:

পাইথন সম্প্রদায়ের (অন্যান্য অনেক সম্প্রদায়ের মতো) কোড কীভাবে লিখবেন সে সম্পর্কে কনভেনশন রয়েছে। এটি কার্যকারী কোডের থেকে পৃথক : আপনি নিজের ধ্রুবকগুলি সমস্ত ছোট হাতের অক্ষরে লিখলেও আপনার কোডটি এখনও কাজ করে।

তবে সম্প্রদায়ের sensকমত্য রয়েছে (পিইপি 8 তে নথি হিসাবে) পাইলটের মতো সরঞ্জামগুলির সাথে "প্রয়োগ করা হয়েছে" । আপনি যদি নিজের সুখের জন্য প্রোগ্রাম করেন তবে আপনি যে ইঙ্গিতগুলি পাইলটটি দিয়েছেন তা অবহেলা করতে পারে। আপনি যদি সম্প্রদায়ের সাথে মুক্ত বিনিময় করতে চান, ওরফে myself আমার ছাড়া অন্য কারও আমার কোডটি ব্যবহার করা উচিত «, আপনার পিইপি 8 অনুসারে আপনার কোডটি প্রস্তুত করা উচিত।


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

@ জুলস আমি একবার পরিবর্তনশীল সেট কল করব এবং রানটাইম চলাকালীন পরিবর্তন কখনও আবার ধ্রুবক না, তাই অনেক ভাষাতে (যেমন জেএসে) একটি constকীওয়ার্ড বিদ্যমান। যদিও প্রাথমিক মানটি ভিন্ন, অন্যটি হতে পারে PI
টমাস

1
আমি একটি অপরিবর্তনীয় পরিবর্তনশীল (উদাহরণস্বরূপ রানটাইমের সময় সেট করা এবং পরিবর্তিত হয়নি এমন কিছু ) এবং একটি ধ্রুবক (অর্থাত্ প্রতিটি প্রোগ্রামে রান করার ক্ষেত্রে একই জিনিস, এবং ভাষাটি যদি বিকল্পটি সরবরাহ করে তবে এটি সংকলনের সময় গণনা করা যেতে পারে) ) ... মুল বক্তব্যটি হ'ল পাইথনটির সাথে পার্থক্যটি নির্দিষ্ট করার কোনও উপায়ের অভাব নেই, pylintতবে পূর্ববর্তী ঘটনাটি এমনকি পরেও ধরে নেওয়া হয়।
জুলে

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

@ মেট্রিকসিস্টেম - আপনার মতে - একটি ধ্রুবক হওয়ার পাশাপাশি কোনও মডিউল স্তরের পরিবর্তনশীল কী থাকতে পারে? এটি পরিবর্তনীয় হতে হবে?
টমাস জাঙ্ক

13

PEP8 এবং পাইথন সম্প্রদায়ের আদর্শ ব্যবহার করা ALL_CAPS_CONSTANTS । এটি সি, জাভা, পার্ল, পিএইচপি, পাইথন, ব্যাশ এবং অন্যান্য প্রোগ্রামিং ভাষা এবং শেল পরিবেশে দশকের জন্য ব্যবহৃত একটি সাধারণ ভিজ্যুয়াল ক্লু। তবে আধুনিক অনলাইন পার্লেন্সে , সমস্ত ক্যাপগুলি স্বাক্ষর করে । আর চিৎকার করা অভদ্র।

পাইথন তবে এটি সম্পর্কে অসঙ্গত ALL_CAPS_CONSTANTS। জাভাস্ক্রিপ্ট থাকতে পারে Math.PI, কিন্তু পাইথন আছে math.pi। Than এর চেয়ে বেশি কোনও স্বীকৃত বা স্থায়ী ধ্রুবক নেই π বা বিবেচনা করুন sys.version_info, আপনি যে পাইথনের সংস্করণটি চালাচ্ছেন তা বিবেচনা করুন। আপনার প্রোগ্রাম জীবনের উপর 100% ধ্রুবক - অনেক বেশী চেয়ে PORTবাMAX_ITERATIONS বা অন্যান্য ধ্রুবক আপনি সংজ্ঞায়িত চাই। বা কেমন sys.maxsize? আপনার প্ল্যাটফর্মের সর্বাধিক নেটিভ পূর্ণসংখ্যার মানটি কেবল এক বা দুটি প্রোগ্রাম চালানো নয়, তবে আপনার হার্ডওয়ারের জীবন থেকেও স্থির।

যদি এই ধ্রুবকগুলি - যেমন some এবং ই সমেত কিছু মহাবিশ্বের মৌলিক ধ্রুবক এবং সমস্ত অনন্তকাল থেকে পৃথক হবে না - সেগুলি নিম্ন-কেস হতে পারে ভাল ... তাই অন্য ধ্রুবকগুলিও হতে পারে। তুমি পছন্দ করতে পারো.

মনে রাখবেন, পিইপি 8 একটি স্টাইল গাইড। একটি গাইডলাইন, আইন নয়। পাইথনের স্ট্যান্ডার্ড লাইব্রেরি দ্বারা প্রায়শই একটি নির্দেশিকা লঙ্ঘন করে। আর একটি মূল পাইথন গাইডলাইন, PEP20 উদ্ধৃত করে (ওরফে "পাইথনের জেন") :

  • কদর্য চেয়ে সুন্দর
  • পঠনযোগ্যতা গণনা
  • ব্যবহারিকতা বিশুদ্ধতা বীট।

একটি ব্যবহারিক নোটে, যখন কোনও প্রোগ্রাম থাকে YELLY_CONSTANTএবং SHOUTY_PARAMETERকষতে শুরু করে, এটি মনে রাখতে সাহায্য করে যে অল-ক্যাপ ধ্রুবকগুলি সাধারণত প্লেটোনিক আদর্শগুলি স্থায়ী হয় না , তবে একটি প্রোগ্রাম চালনার পরামিতি। সম্পর্কে সত্যিই ধ্রুবক কিছুই নেই PORT, SITENAMEঅথবা NUMRUNS, এবং তারা স্বতন্ত্র প্রোগ্রাম globals যেমন পরিচালিত হতে হবে না। উদাহরণস্বরূপ, এগুলি প্রোগ্রামের পরামিতিগুলির বিশ্বব্যাপী অ্যাক্সেসযোগ্য বান্ডিল হিসাবে অভিধানে ফেলে দেওয়া যেতে পারে:

config = {
    'port': 80,
    'sitename': "Bubba's Blog",
    'numruns': 100,
}

পাইথনের একটি দুর্দান্ত কীওয়ার্ড প্যারামিটার পাসিং সুবিধা রয়েছে যা ব্যবহারের প্রয়োজনীয়তা হ্রাস করে APPARENTLY_ANGRY_GLOBAL_VARIABLES:

def process_data(sitename, port=80, numruns=100):
    ...

process_data("Bubba's Blog")

অনুশীলনে, কন্ট্রোল নীতি / প্যাটার্নের বিপরীততাকে সন্তুষ্ট করার জন্য কনফিগার ফাইল, ওএস এনভায়রনমেন্ট ভেরিয়েবল, কমান্ড লাইন আর্গুমেন্ট বা অন্যান্য উত্স থেকে এই মানগুলির অনেকগুলি (বা হওয়া উচিত) read তবে এটি অন্য দিনের জন্য বৃহত্তর গল্প।


1

হ্যাঁ, বেশিরভাগ প্রোগ্রামিং ভাষায় এটি বেশ সাধারণ (কমপক্ষে আমি সেগুলি ব্যবহার করি)।

আপনি এই গুগল লিঙ্কটি উল্লেখ করতে পারেনএকই দলের বিকাশকারীদের মধ্যে একটি সাধারণ শৈলী ভাগ ।

এটি ব্যবহার করার পরামর্শ দেওয়া হয়

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