প্রোগ্রাম ব্যাহত না করে পাইথনে সতর্কতা বাড়ান


189

আমি প্রোগ্রামটি ক্র্যাশ / স্টপ / বাধা না দিয়ে পাইথনে একটি সতর্কতা বাড়াতে চাইছি।

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

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     print "WARNING: the input is 0!"
   return i

যদি আমি নীচের কোডটি ব্যবহার করি এবং 0 টি ফাংশনে পাস করি তবে প্রোগ্রামটি ক্র্যাশ হয়ে যায় এবং মানটি কখনই ফিরে আসে না। পরিবর্তে, আমি চাই যে প্রোগ্রামটি স্বাভাবিকভাবেই চালিয়ে যায় এবং কেবল ব্যবহারকারীকে জানায় যে সে 0 এ কার্যক্রমে চলে গেছে।

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     raise Warning("the input is 0!")
   return i

আমি পরীক্ষা করতে সক্ষম হতে চাই যে ইউনিটেটের মাধ্যমে এটি পরীক্ষা করে কোনও সতর্কতা ফেলে দেওয়া হয়েছে। যদি আমি কেবল বার্তাটি মুদ্রণ করি তবে আমি এটির পরীক্ষার সাথে ইউনিটেটে রাইজেস দিয়ে পরীক্ষা করতে পারছি না।


আপনি কিভাবে ব্যবহারকারীকে অবহিত করতে চান? ইমেল বা এসএমএসের মাধ্যমে? হুক আপ করা যেতে পারে কারণ আপনি নির্দিষ্ট করা প্রয়োজন।
অ্যারোনাস্টারিং

2
তুমি শুধু printবার্তা দিচ্ছো না কেন ?
sje397

1
@ sje397 মুল বক্তব্যটি হ'ল আমি পরীক্ষা করতে সক্ষম হতে চাই যে কোনও সতর্কতা এটি ইউনিটেটের মাধ্যমে পরীক্ষা করে ফেলেছে। যদি আমি কেবল বার্তাটি মুদ্রণ করি তবে আমি ইউনিটেস্টে অ্যাসেটরাইজেস সহ এটি করতে সক্ষম নই।
টমাস নভটনি

উত্তর:


157

raiseআপনার সতর্কতা থাকা উচিত নয় , আপনার warningsমডিউলটি ব্যবহার করা উচিত । এটি উত্থাপন করে আপনি সতর্কতার চেয়ে ত্রুটি উত্পন্ন করছেন।


1
আপনাকে অনেক ধন্যবাদ. এবং তারপরে আমি কীভাবে পরীক্ষা করব যে সতর্কতাটিকে ইউনিটেস্ট ব্যবহার করে নিক্ষেপ করা হয়েছে? আমি আর assertRaises () ব্যবহার করতে পারি না।
টমাস নোভটনি

@ টমাস নোভত্নি আপনি স্টাডআউট এবং স্টডারকে ক্যাপচার করতে পারেন, তারপরে আপনার সতর্কতার দ্বারা জারি করা স্ট্রিংগুলি এর মধ্যে পাওয়া গেছে কিনা তা পরীক্ষা করে দেখুন।
Whe Whees

15
@ টমাস: আমি সতর্কতার জন্য পরীক্ষা করার ইচ্ছা সম্পর্কে কখনও শুনিনি, তবে এমন একটি warnings.catch_warningsপ্রসঙ্গ পরিচালক রয়েছে যা আপনাকে এটি করতে দেবে this
সাইলেন্টগোস্ট

289
import warnings
warnings.warn("Warning...........Message")

পাইথন ডকুমেন্টেশন দেখুন: এখানে


6
আর warnings.warn("blabla", DeprecationWarning)এর সতর্কতার ধরনের একটি বর্গ যোগ করার জন্য ইস্যু করা হচ্ছে
দয়া

52

ডিফল্টরূপে, একটি ব্যতিক্রমের মতো নয়, একটি সতর্কতা বাধা দেয় না।

পরে import warnings, সতর্কতা তৈরি করার সময় কোনও সতর্কতা শ্রেণি নির্দিষ্ট করা সম্ভব । যদি একটি নির্দিষ্ট না করা হয় তবে এটি আক্ষরিক অর্থে UserWarningডিফল্ট হয়।

>>> warnings.warn('This is a default warning.')
<string>:1: UserWarning: This is a default warning.

পরিবর্তে কেবলমাত্র একটি প্রাকশিক্ষা শ্রেণি ব্যবহার করতে, যেমন DeprecationWarning:

>>> warnings.warn('This is a particular warning.', DeprecationWarning)
<string>:1: DeprecationWarning: This is a particular warning.

একটি কাস্টম সতর্কতা শ্রেণি তৈরি করা একটি কাস্টম ব্যতিক্রম শ্রেণি তৈরি করার অনুরূপ:

>>> class MyCustomWarning(UserWarning):
...     pass
... 
... warnings.warn('This is my custom warning.', MyCustomWarning)

<string>:1: MyCustomWarning: This is my custom warning.

পরীক্ষার জন্য, বিবেচনা করুন assertWarnsবা assertWarnsRegex


বিকল্প হিসাবে, বিশেষত স্বতন্ত্র অ্যাপ্লিকেশনগুলির জন্য, loggingমডিউলটি বিবেচনা করুন । এটা একটি স্তর থাকার বার্তা লগ ইন করতে পারেন ডিবাগ , তথ্য , সতর্কবার্তা , ত্রুটি , ইত্যাদি একটি স্তর থাকার লগিন বার্তা সতর্কবার্তা বেশি বা ডিফল্ট stderr হবে মুদ্রিত দ্বারা হয়।

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