অজগরটি প্রথম বন্ধনীর সাথে এবং ছাড়াও জোর দেয়


107

দৃ as়তার চারটি সাধারণ অনুরোধ এখানে রয়েছে:

>>> assert 1==2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError

>>> assert 1==2, "hi"
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError: hi

>>> assert(1==2)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError

>>> assert(1==2, "hi")

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


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

4
একটি পার্থক্য হ'ল আপনি অন্তর্নির্মিত ফাংশনগুলিকে নতুন করে সংজ্ঞায়িত করতে পারেন তবে কীওয়ার্ডগুলির সাথে এটি করতে পারবেন না (এটি পূর্বেরটি ভাল ধারণা নয়)।
গাফান

এটি কী-ওয়ার্ড ডিফারেন্সে ফাংশন নয়, তবে ফাংশন কল বনাম বিবৃতি । (উদাহরণস্বরূপ - মুদ্রণ একটি বিবৃতি হিসাবে ব্যবহৃত হত, এবং প্রথম বন্ধনী ছাড়াই কাজ করেছে)।
টমজ গ্যান্ডার

উত্তর:


130

সর্বশেষ assertআপনাকে একটি সতর্কতা দিতেন ( SyntaxWarning: assertion is always true, perhaps remove parentheses?) যদি আপনি এটি কোনও পূর্ণ ব্যাখ্যাকারীর মাধ্যমে চালিত করেন, আইডলির মাধ্যমে নয়। কারণ assertএকটি কীওয়ার্ড এবং কোনও ফাংশন নয়, আপনি আসলে প্রথম যুক্তি হিসাবে একটি দ্বীপপুঞ্জে চলে যাচ্ছেন এবং দ্বিতীয় যুক্তিটি ত্যাগ করছেন।

মনে রাখবেন যে খালি নয় এমন টিপলগুলি মূল্যায়ন করে Trueএবং যেহেতু দাবি বার্তাটি isচ্ছিক, তাই আপনি assert Trueযখন লিখতেন তখন আপনাকে মূলত ডেকে আনে assert(1==2, "hi")


10
এর কারণটি ঘটছে না কারণ assert (1==2)একক অভিব্যক্তির চারপাশে বন্ধনীগুলি স্বয়ংক্রিয়ভাবে একটি টিপল তৈরি করবে না; আপনি যদি এটি করেন তবে আপনি # 4 এর মতো আচরণ পাবেন assert (1==2,)। আপনি যদি print ('foo', 'bar')পরিবর্তে এটি করেন তবে একই জিনিস ঘটবে print 'foo', 'bar'; আপনি দেখতে পাবেন
টুপলটি

ফর্মের বিবৃতি assert(test, message)সম্ভবত ভুল, এবং অবশ্যই বিভ্রান্তিকর তা জোর দিয়ে আরও মূল্যবান । কোন প্যারেনস!
tcarobruce

20
সুতরাং, আর্ট পিইপি 8 লম্বা দাবী বিবৃতি যুক্ত করার সঠিক উপায় কী? অসম্ভব বলে মনে হচ্ছে।
stantonk


32

আপনি যদি সেখানে বন্ধনীটি রেখে দেন কারণ আপনি একটি বহু-লাইন জোর চাইছিলেন, তারপরে একটি বিকল্প হ'ল লাইনের শেষে একটি ব্যাকস্ল্যাশ রাখুন:

foo = 7
assert foo == 8, \
    "derp should be 8, it is " + str(foo)

মুদ্রণ:

AssertionError: "derp should be 8, it is 7

এই অজগরটি কেন assertঅন্য সমস্ত কিছুর চেয়ে আলাদা হতে হবে:

আমি মনে করি পাইথোনিক মতাদর্শটি হ'ল একটি প্রোগ্রামের দাবিগুলি চালু করার জন্য বিশেষ পতাকাটি নিয়ে চিন্তা না করেই স্ব-সংশোধন করা উচিত। জমিদারিগুলি বন্ধ করার প্রলোভনটি খুব দুর্দান্ত, এবং সুতরাং এটি হ্রাস করা হচ্ছে।

আমি আপনার বিরক্তি শেয়ার করি যে পাইথনের assertঅন্যান্য সমস্ত পাইথন প্রোগ্রামিং কনস্ট্রাক্টের তুলনায় পাইথনের অনন্য সিনট্যাক্স রয়েছে এবং এই বাক্য গঠনটি আবার পাইথন 2 থেকে পাইথন 3 এবং আবার অজগর 3.4 থেকে 3.6 এ পরিবর্তিত হয়েছে। জোর দেওয়া বিবৃতিগুলি কোনও সংস্করণ থেকে অন্য কোনও সংস্করণে পিছনে সামঞ্জস্যপূর্ণ নয়।

এটি কাঁধের উপর একটি ট্যাপ যা assertতৃতীয় শ্রেণির নাগরিক, এটি পাইথন 4 এ সম্পূর্ণভাবে সরানো হবে এবং অবশ্যই আবার পাইথন 8.1-এ in


4
দাবি করার পরিবর্তে আমাদের কী ব্যবহার করা উচিত সে বিষয়ে ডক আছে? দৃsert়তা যাচাইকরণের জন্য এই জাতীয় যৌক্তিক নামের মতো মনে হয় এবং এটিতে পছন্দসই আচরণ রয়েছে, উদাহরণস্বরূপ ত্রুটির উপর একটি বিশেষ বার্তা প্রদর্শন করুন।
অ্যানি দ্য অ্যাজিল

18

assert 1==2, "hi"মূল শব্দটির assert 1==2, "hi"দ্বিতীয় প্যারামিটার হিসাবে "হাই" দিয়ে পার্স করা হয়েছে । সুতরাং কেন এটি সঠিকভাবে একটি ত্রুটি দেয়।

assert(1==2)যেমনটি অদৃশ্য হিসাবে পার্স করা assert (1==2)হয় assert 1==2, কারণ কোনও একক আইটেমের চারপাশে পেরেনগুলি একটি ট্রিপল কমা যেমন না থাকে তবে একটি টুপল তৈরি করে না (1==2,)

assert(1==2, "hi")পার্স করা হয়েছে assert (1==2, "hi"), যা ত্রুটি দেয় না কারণ একটি খালি টিপল (False, "hi")একটি মিথ্যা মান নয় এবং মূলশব্দটিতে সরবরাহ করা কোনও দ্বিতীয় প্যারামিটার নেই।

assertপাইথনে কোনও ফাংশন নয় বলে আপনার প্রথম বন্ধনী ব্যবহার করা উচিত নয় - এটি একটি কীওয়ার্ড।


14

আপনি এটির \মতো জোর দিয়ে বিবৃতিটি ভাঙ্গতে পারেন :

foo = 7
assert foo == 8, (
    'derp should be 8, it is ' + str(foo))

অথবা যদি আপনার আরও দীর্ঘ বার্তা থাকে:

foo = 7
assert foo == 8, (
    'Lorem Ipsum is simply dummy text of the printing and typesetting '
    'industry. Lorem Ipsum has been the industry\'s standard dummy text '
    'ever since the 1500s'
)

4
আকর্ষণীয় ধারণা। ধারাবাহিকতার জন্য আমি ব্যাকস্ল্যাশগুলি ঘৃণা করি এবং এটি কোনও ইউটিলিটি ফাংশনে (যা আমার সমাধান ছিল) মোড়ক জড়ানোর বিকল্প।
টমজ গ্যান্ডার

1

পাইথন ডক থেকে নিম্নলিখিতটি উদ্ধৃত করা হয়েছে

প্রোগ্রামটিতে ডিবাগিং সংযোজন সন্নিবেশ করানোর পক্ষে যুক্তিযুক্ত বিবৃতি হ'ল সুবিধাজনক উপায়:

assert_stmt ::= "assert" expression ["," expression]

সাধারণ ফর্ম, জোড় প্রকাশ, সমতুল্য if __debug__: if not expression: raise AssertionError

এক্সটেনশন 1, এক্সপ্রেশন 2 এর বর্ধিত রূপটি সমান if __debug__: if not expression1: raise AssertionError(expression2)

সুতরাং আপনি যখন এখানে প্রথম বন্ধনী ব্যবহার করছেন, আপনি সাধারণ ফর্মটি ব্যবহার করছেন এবং এক্সপ্রেশনটি একটি টিউপল হিসাবে মূল্যায়ন করা হয় যা বুল হওয়ার সময় সর্বদা সত্য is

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