পাইথনে জোর দেওয়া অক্ষম করুন


90

পাইথনে আমি কীভাবে দাবিগুলি অক্ষম করব?

এটি হ'ল, যদি কোনও দৃ f়তা ব্যর্থ হয় তবে আমি চাই না যে এটি একটি নিক্ষেপ করবে AssertionError, তবে চালিয়ে যাওয়া।

আমি কেমন করে ঐটি করি?

উত্তর:


75

পাইথনে আমি কীভাবে দাবিগুলি অক্ষম করব?

একাধিক পদ্ধতি রয়েছে যা একটি একক প্রক্রিয়া, পরিবেশ বা কোডের একক লাইনকে প্রভাবিত করে।

আমি প্রতিটি প্রদর্শন।

পুরো প্রক্রিয়া জন্য

-Oপতাকা ব্যবহার করে (মূলধন ও) কোনও প্রক্রিয়াতে সমস্ত দৃ as় বিবৃতি অক্ষম করে।

উদাহরণ স্বরূপ:

$ python -Oc "assert False"

$ python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError

নোট করুন যে অক্ষম করে বলতে চাইলে এটি এর দ্বারা প্রকাশিত অভিব্যক্তিটি কার্যকর করে না:

$ python -Oc "assert 1/0"

$ python -c "assert 1/0"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

পরিবেশের জন্য

আপনি এই পতাকাটি সেট করতে আপনি পরিবেশের পরিবর্তনশীল ব্যবহার করতে পারেন।

এটি পরিবেশকে উত্তরাধিকার সূত্রে প্রাপ্ত প্রতিটি প্রক্রিয়াগুলিকে প্রভাবিত করবে process

উদাহরণস্বরূপ, উইন্ডোজে, পরিবেশ পরিবর্তনশীল নির্ধারণ এবং তারপরে সাফ করুন:

C:\>python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError
C:\>SET PYTHONOPTIMIZE=TRUE

C:\>python -c "assert False"

C:\>SET PYTHONOPTIMIZE=

C:\>python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError

ইউনিক্সে একই ( সম্পর্কিত কার্যকারিতার জন্য সেট এবং আনসেট ব্যবহার করে)

কোডে একক পয়েন্ট

আপনি আপনার প্রশ্ন চালিয়ে যান:

যদি একটি দৃ f়তা ব্যর্থ হয়, আমি এটি একটি AssertionError নিক্ষেপ করতে চাই না, কিন্তু চালিয়ে যেতে চাই।

আপনি যদি কোডটি প্রয়োগ করতে ব্যর্থ হন তবে আপনি নিয়ন্ত্রণের প্রবাহটি দৃ reach়তার সাথে পৌঁছে না তা নিশ্চিত করে ধরতে পারেন, উদাহরণস্বরূপ:

if False:
    assert False, "we know this fails, but we don't get here"

বা আপনি দৃ error়তা ত্রুটি ধরতে পারেন:

try:
    assert False, "this code runs, fails, and the exception is caught"
except AssertionError as e:
    print(repr(e))

যা প্রিন্ট করে:

AssertionError('this code runs, fails, and the exception is caught')

এবং আপনি যে বিন্দুটি পরিচালনা করেছেন তা থেকে আপনি চালিয়ে যাবেন AssertionError

তথ্যসূত্র

থেকে ডকুমেন্টেশন :assert

এর মতো একটি দৃsert় বক্তব্য:

assert expression #, optional_message

এর সমতুল্য

if __debug__:
    if not expression: raise AssertionError #(optional_message)

এবং,

বিল্ট-ইন পরিবর্তনশীল __debug__হয় Trueস্বাভাবিক পরিস্থিতিতে, Falseযখন অপ্টিমাইজেশান অনুরোধ করা হয় (কমান্ড লাইন বিকল্প -O)।

এবং আরও

অ্যাসাইনমেন্ট __debug__অবৈধ। অন্তর্নির্মিত ভেরিয়েবলের জন্য মান নির্ধারণ করা হয় যখন দোভাষী শুরু হয়।

ব্যবহার নথি থেকে:

-ও

বেসিক অনুকূলকরণ চালু করুন। এটি .pyc থেকে .pyo এ সংকলিত (বাইটকোড) ফাইলগুলির জন্য ফাইলের নাম এক্সটেনশন পরিবর্তন করে। পাইথনপটিমিমিজও দেখুন।

এবং

পাইথনপটিমাইজ করুন

যদি এটি একটি খালি খালি স্ট্রিংয়ে সেট করা থাকে তবে এটি -Oবিকল্পটি নির্দিষ্ট করার সমান । যদি কোনও পূর্ণসংখ্যকে সেট করা থাকে তবে এটি -Oএকাধিকবার নির্দিষ্ট করার সমান ।


'কোডের একক পয়েন্ট' এর ক্ষেত্রে যে কোডটি ব্যর্থ হয় তা কী এড়িয়ে যাওয়া সম্ভব হবে? আমি __debug__মিথ্যাতে সেট করার চেষ্টা করেছি তবে এটি অনুমোদিত নয়।
ম্যাথিজগুলি

4
@ ম্যাথিজ আপনি নিশ্চিত করতে পারেন নিয়ন্ত্রণ প্রবাহ এটিতে পৌঁছায় না (উদাঃ if False: assert False) অথবা আপনি দৃser়তা ত্রুটিটি ধরতে পারেন। সেগুলি আপনার পছন্দ। আপনার প্রশ্নের সমাধানের উত্তর আপডেট করেছেন।
অ্যারন হল

উত্তরের জন্য ধন্যবাদ, তবে এখনও আমি পুরোপুরি যা ভাবছিলাম তা নয়। কথন মূল্যায়ন করা হয়: নিষ্ক্রিয় রানটাইম সময় একটি ফাংশন ভিতরে দাবি করা, আদর্শভাবে প্রসঙ্গ ম্যানেজার কিছু সাজানোর সঙ্গে আমি চাই foo()এবং সুইচিং গবেষকেরা বন্ধ: with skip_assertion(): foo()। এর সুবিধাটি হ'ল আমাকে ফাংশনে আরও একটি পতাকা যুক্ত করতে হবে না
ম্যাথিজস

4
আপনি ফাংশনটির বাইকোড পুনর্লিখন করতে পারেন, এএসটি পুনরায় লিখতে পারেন বা নিজেই ফাংশনটি পুনরায় লিখতে পারেন। (ম্যানুয়ালি বা প্রোগ্রামগতভাবে, উভয়ের জন্য)। এএসটি পুনর্নির্মাণ সম্ভবত সবচেয়ে নির্ভরযোগ্য পন্থা হবে ("সহজভাবে" Assertবস্তুর সাথে Passবস্তুর প্রতিস্থাপন )। একটি প্রসঙ্গে পরিচালক সরাসরি এটির জন্য কাজ করবেন না, তবে আপনার কাছে এমন কোনও প্রক্রিয়া থাকতে পারে যা সজ্জিত ফাংশনগুলি সেভাবে ব্যবহার করে। নির্বিশেষে, আমি এটি সুপারিশ করি না। আমি সন্দেহ করি যে এটি করার জন্য আপনার কারণটি হচ্ছে আপনি কোডটি কল করছেন যা আপনি নিয়ন্ত্রণ করেন না এবং AssertionErferences পেয়ে যাচ্ছেন। যদি তা হয় তবে আপনার সম্ভবত অন্য একটি ঠিক করার প্রয়োজন রয়েছে।
হারুন হলের

59

-ও পতাকা সহ পাইথনকে কল করুন:

পরীক্ষা.পি:

assert(False)
print 'Done'

আউটপুট:

C:\temp\py>C:\Python26\python.exe test.py
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    assert(False)
AssertionError

C:\temp\py>C:\Python26\python.exe -O test.py
Done

8
জোর দেওয়া কোনও ফাংশন নয়, সুতরাং প্যারেনগুলি অতিমাত্রায়।
অ্যারন হল

15

দুটি উত্তর ইতিমধ্যে দেওয়া দুটি বৈধ (হয় সঙ্গে পাইথন কল -Oবা -OOকমান্ড লাইন তে) খুলুন।

এখানে তাদের মধ্যে পার্থক্য:

  • -Oবেসিক অনুকূলকরণ চালু করুন। এটি .pyc থেকে .pyo এ সংকলিত (বাইটকোড) ফাইলগুলির জন্য ফাইলের নাম এক্সটেনশন পরিবর্তন করে।

  • -OOবাতিল করুন docstrings ছাড়াও করার -Oঅপ্টিমাইজেশন।

( পাইথন ডকুমেন্টেশন থেকে )



3

আপনার (সর্বাধিক) প্রতিবেদন অক্ষম করা উচিত নয় । মনোযোগ অন্য কোথাও এলে তারা অপ্রত্যাশিত ত্রুটিগুলি ধরা দেয়। "দশের শক্তি" এর বিধি 5 দেখুন ।

পরিবর্তে, কিছু ব্যয়বহুল দৃser়তা চেকগুলি এমন কিছু দ্বারা রক্ষা করুন:

import logging
logger = logging.getLogger(__name__)

if logger.getEffectiveLevel() < logging.DEBUG:
    ok = check_expensive_property()
    assert ok, 'Run !'

গুরুত্বপূর্ণ বক্তব্য রাখার একটি উপায় এবং assertবিবৃতিগুলি অপ্টিমাইজ করা যায় না বাছাই বিবৃতিতে তাদের উত্থাপন করা:

if foo_is_broken():
    raise AssertionError('Foo is broken!')

4
//, সমস্যাটি হ'ল যদিও বিবৃতিটি এখনও চক্রবৃত্তীয় জটিলতায় যোগ করে, এবং ত্রুটি পরিচালনার সাথে বাকী অংশটি কী পরিচালনা করা উচিত?
নাথান বাসানিজ

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

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

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