শুধুমাত্র ডিবাগ করতে মুদ্রণ বিবৃতি ব্যবহার


109

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

উত্তর:


161

loggingমডিউল সবকিছু আপনি চান পারে হয়েছে। এটি প্রথমে অতিরিক্ত মনে হতে পারে তবে কেবল আপনার প্রয়োজনীয় অংশগুলি ব্যবহার করুন। আমি ব্যবহার বলতে চাই logging.basicConfigথেকে লগিং স্তর টগল করার জন্য stderrএবং সহজ লগ পদ্ধতি , debug, info, warning, errorএবং critical

import logging, sys
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logging.debug('A debug message!')
logging.info('We processed %d records', len(processed_records))

5
এছাড়াও, আমার মতো এই মডিউলটি ইনস্টল করতে আপনার যদি সমস্যা হয়; লগিং স্ট্যান্ডার্ড লাইব্রেরির অংশ - ভার্চুয়াল পরিবেশ ব্যবহার করার পরেও পাইপ ইনস্টলের দরকার নেই
আমর

কেউ কীভাবে লগিংয়ের স্তরটি এমনভাবে সেট করে যে এটি কেবল ত্রুটিগুলি মুদ্রণ করে বার্তা ডিবাগ করে না?
এডুয়ার্ডো পিগনেটেলি

@EduardoPignatelli সেট level, এ basicConfigকল, এর logging.ERROR
ম্যাট জয়েনার

আমি আশঙ্কা করছি এটি জুপিটার ল্যাব ২.২.। এ কাজ করে না। আপনি একবার লগিং স্তর সেট করতে পারেন এবং পুনরায় সেটিং ব্যবহার logging.basicConfig(stream=sys.stderr, level=logging.ERROR)করা কোনও প্রভাব ফেলবে না। কার্নেলটি পুনরায় আরম্ভ করা এবং নতুন স্তরের সেট করা কাজ করে তবে এটি আমার পক্ষে কার্যকর নয়।
এডুয়ার্ডো পিগনেটেলি

@ এদুয়ার্ডোপিনেটেল্টি এর জন্য আপনার আরও একটি প্রশ্ন জিজ্ঞাসা করা উচিত। তবে সম্ভবত আপনাকে সরাসরি রুট লগারের স্তরটি পরিবর্তন করতে হবে, সম্ভবত জুপিটার সম্ভবত আপনার আগে বেসিক কনফিগ কল করছে।
ম্যাট জয়েনার

28

এটি করার একটি সহজ উপায় হ'ল লগিং ফাংশনটি কল করা:

DEBUG = True

def log(s):
    if DEBUG:
        print s

log("hello world")

তারপরে আপনি DEBUGলগইন ছাড়াই বা ছাড়াই আপনার কোডটির মান পরিবর্তন করতে এবং চালাতে পারেন ।

মানক loggingমডিউলটির এটির জন্য আরও বিস্তৃত প্রক্রিয়া রয়েছে।


5
সরবরাহ করা লগিং মডিউলটি নিজের রোলের চেয়ে বেশি দীর্ঘায়নের ক্ষেত্রে সম্ভবত এটি আরও ভাল (যদিও এটি আরও জটিল দেখাচ্ছে)।
এমজিচা

11
সত্য, তবে এটি কীভাবে তাদের নিজস্ব রোল করতে পারে তা বোঝার উপযুক্ত ।
গ্রেগ হিউগিল

1
প্রকৃতপক্ষে. উপরেরটি কীভাবে loggingকাজ করে তা একটি খুব ভাল ধারণা (খুব সাধারণ স্তরে)।
মিগিয়াকা

এটি আমার আউস ল্যাম্বডাসের জন্য ব্যবহার করি।
crsuarezf

21

ব্যবহার করুন লগিং বিল্ট-ইন গ্রন্থাগার পরিবর্তে মডিউল মুদ্রণ।

আপনি একটি Loggerঅবজেক্ট তৈরি করুন (বলুন logger) এবং তারপরে, যখনই আপনি কোনও ডিবাগ প্রিন্ট সন্নিবেশ করান, আপনি কেবল:

logger.debug("Some string")

logger.setLevelআউটপুট স্তরটি সেট করতে আপনি প্রোগ্রামের শুরুতে ব্যবহার করতে পারেন । আপনি যদি এটি DEBUG এ সেট করেন তবে এটি সমস্ত ডিবাগগুলি মুদ্রণ করবে। এটি INFO বা উচ্চতরতে সেট করুন এবং সাথে সাথে সমস্ত ডিবাগগুলি অদৃশ্য হয়ে যাবে।

আপনি বিভিন্ন স্তরে (তথ্য, সতর্কতা এবং ত্রুটি) আরও গুরুতর জিনিস লগ করতে এটি ব্যবহার করতে পারেন।


12

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

logging.debug("datastructure: %r" % complex_dict_structure)

আপনি নিশ্চিত হন:

logging.debug("datastructure: %r", complex_dict_structure)

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

def debug_stdout(sfunc):
    print(sfunc())

debug = debug_stdout

এর মাধ্যমে বলা হয়:

debug(lambda: "datastructure: %r" % complex_dict_structure)

যদি আপনি এটি করে অক্ষম করে দেন তবে ওভারহেড এড়াতে পারবেন:

def debug_noop(*args, **kwargs):
    pass

debug = debug_noop

এই স্ট্রিংগুলি গণনা করার ওভারহেড সম্ভবত কোনও ব্যাপার নয় যতক্ষণ না সেগুলি হয় 1) গণনা করা ব্যয়বহুল বা 2) ডিবাগ স্টেটমেন্টটি একটি এন ^ 3 লুপ বা কোনও কিছুর মাঝখানে রয়েছে। আমি যে সম্পর্কে কিছু জানতে হবে না যে।



7

আমি অন্যদের সম্পর্কে জানি না, তবে আমি একটি "গ্লোবাল ধ্রুবক" ( DEBUG) এবং তারপরে একটি গ্লোবাল ফাংশন ( debug(msg)) সংজ্ঞায়িত করতে ব্যবহৃত হয়েছিল যা msgকেবল তখনই মুদ্রণ করতে পারে DEBUG == True

তারপরে আমি আমার ডিবাগ স্টেটমেন্টগুলি লিখি যেমন:

debug('My value: %d' % value)

... তারপরে আমি ইউনিট পরীক্ষা নিলাম এবং এটি আর কখনও করিনি! :)


ইউনিট পরীক্ষা ঠিক আছে, তারপরে আর একটি জিনিস তোলা উচিত :(
পাগলআউটলাইভ

1
আমি ইউনিট পরীক্ষাকে নিরুৎসাহিত করতে চাই না - এটি প্রয়োজনীয়। তবে আমি মনে করি না এটি ডিবাগিংয়ের কৌশল হিসাবে এমনকি লগিংয়ের বিকল্প। জিনিসগুলি দ্রুত পরীক্ষার জন্য আমি এখনও প্রচুর মুদ্রণ করি।
মিগিয়াকা

@ ক্রাজিয়াবাউটিলিভ - ইউনিট পরীক্ষা সঠিকভাবে করা দুর্দান্ত। চটজলদি, সংক্ষিপ্ত, সহজে অনুসরণযোগ্য উপস্থাপনাটির জন্য অজগরটিতে ডুব দেওয়ার এই অধ্যায়টি দেখুন
ম্যাক

@ এমজিউকা - আমি দ্রুত প্রিন্টিংও করি, তবে print()পরীক্ষায় উত্তীর্ণ হওয়ার জন্য প্রয়োজনীয় কোডটিতে আমার কোড আনার সময় এটি কয়েক বা কয়েকটা বেশি । আমি কখনও print()জায়গা জুড়ে বিপুল পরিমাণে শেষ করি না । লগিং খুব দুর্দান্ত! :)
ম্যাক

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