পাইথন 3 কেন "00" কে 0 এর আক্ষরিক হিসাবে অনুমতি দেয় তবে "01" কে 1 এর জন্য আক্ষরিক হিসাবে অনুমতি দেয় না?


111

পাইথন 3 কেন "00" কে 0 এর আক্ষরিক হিসাবে অনুমতি দেয় তবে "01" কে 1 এর জন্য আক্ষরিক হিসাবে অনুমতি দেয় না? কোন ভাল কারণ আছে? এই অসঙ্গতি আমাকে অবাক করে দেয়। (এবং আমরা পাইথন 3 এর কথা বলছি, যা ধারাবাহিকতার মতো লক্ষ্য অর্জনের জন্য উদ্দেশ্যমূলকভাবে পশ্চাদপদ সামঞ্জস্যকে ভেঙে দিয়েছে।)

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

>>> from datetime import time
>>> time(16, 00)
datetime.time(16, 0)
>>> time(16, 01)
  File "<stdin>", line 1
    time(16, 01)
              ^
SyntaxError: invalid token
>>>

42
এটি এখনই সরানো যাবে না, বা এটি এই প্রশ্নের সাথে পশ্চাদপটে সামঞ্জস্যতা ভেঙে দেবে!
জন লা রোয়

উত্তর:


103

Https://docs.python.org/3/references/lexical_analysis.html#integer-literals প্রতি :

পূর্ণসংখ্যার আক্ষরিক নীচের বর্ণনামূলক সংজ্ঞা দ্বারা বর্ণিত হয়:

integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::=  nonzerodigit digit* | "0"+
nonzerodigit   ::=  "1"..."9"
digit          ::=  "0"..."9"
octinteger     ::=  "0" ("o" | "O") octdigit+
hexinteger     ::=  "0" ("x" | "X") hexdigit+
bininteger     ::=  "0" ("b" | "B") bindigit+
octdigit       ::=  "0"..."7"
hexdigit       ::=  digit | "a"..."f" | "A"..."F"
bindigit       ::=  "0" | "1"

উপলব্ধ স্মৃতিতে কী সংরক্ষণ করা যায় তা বাদ দিয়ে পূর্ণসংখ্যার আক্ষরিক দৈর্ঘ্যের কোনও সীমা নেই is

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

এখানে উল্লিখিত হিসাবে, একটি শূন্য- দশমিক সংখ্যাতে শীর্ষস্থানীয় শূন্যগুলি অনুমোদিত নয়। "0"+একটি খুব বিশেষ কেস হিসাবে আইনী, যা পাইথন 2 তে উপস্থিত ছিল না :

integer        ::=  decimalinteger | octinteger | hexinteger | bininteger
decimalinteger ::=  nonzerodigit digit* | "0"
octinteger     ::=  "0" ("o" | "O") octdigit+ | "0" octdigit+

এসভিএন কমিট r55866 টোকেনাইজারে পিইপি 3127 প্রয়োগ করেছে, যা পুরাতন 0<octal>সংখ্যাগুলি নিষিদ্ধ করে । তবে কৌতূহলজনকভাবে, এটি এই নোটটি যুক্ত করে:

/* in any case, allow '0' as a literal */

একটি বিশেষ nonzeroপতাকা রয়েছে যা কেবলমাত্র একটি SyntaxErrorঅঙ্কিত করে যদি নিম্নলিখিত সংখ্যার ক্রমটিতে একটি ননজারো অঙ্ক থাকে।

এটি বিজোড় কারণ পিইপি 3127 এই কেসটিকে অনুমতি দেয় না:

এই পিইপি প্রস্তাব দেয় যে শীর্ষস্থানীয় শূন্যটি ব্যবহার করে অষ্টাল সংখ্যা নির্দিষ্ট করার ক্ষমতাটি পাইথন 3.0.০ (এবং পাইথন preview.০ প্রিভিউ মোড ২. 2. ) এর ভাষা থেকে মুছে ফেলা হবে এবং যখন একটি শীর্ষস্থানীয় "0" থাকবে তখন সিন্ট্যাক্সেরর উত্থাপিত হবে তাত্ক্ষণিকভাবে অন্য একটি সংখ্যা অনুসরণ করে

(জোর আমার)

সুতরাং, একাধিক জিরো অনুমোদিত হ'ল প্রযুক্তিগতভাবে পিইপি লঙ্ঘন করছে এবং মূলত জর্জ ব্র্যান্ডেল একটি বিশেষ মামলা হিসাবে প্রয়োগ করেছিলেন। তিনি সম্পর্কিত ডকুমেন্টেশন পরিবর্তন করে নোট করুন যে "0"+এটি একটি বৈধ মামলা ছিল decimalinteger(আগে যা এর আওতাধীন ছিল octinteger)।

আমরা সম্ভবত কখনই জানতে পারবে না ঠিক কেন গেয়র্গ করতে বেছে নেওয়া হয়েছে "0"+বৈধ - এটা সব সময় প্রবেশ করুন পাইথন মধ্যে একটি বিজোড় কোণ ক্ষেত্রে থাকতে পারে।


আপডেট [২৮ জুলাই ২০১৫]: এই প্রশ্নটি অজগর-ধারণাগুলির উপর একটি সজীব আলোচনার সূচনার দিকে পরিচালিত করেছিল যেখানে জর্জি এই সিদ্ধান্ত নিয়েছিলেন :

স্টিভেন ডি অ্যাপ্রানো লিখেছেন:

কেন এটি এভাবে সংজ্ঞায়িত করা হয়েছিল? [...] আমরা শূন্য পেতে 0000 লিখব কেন?

আমি আপনাকে বলতে পারতাম, তবে তবে আপনাকে হত্যা করতে হবে।

গেয়র্গ

পরে, থ্রেডটি এই বিশেষ কেসটি থেকে মুক্তি পাওয়ার লক্ষ্যে এই বাগ রিপোর্টটি তৈরি করেছিল । এখানে, জর্জি বলেছেন :

আমি এই ইচ্ছাকৃত পরিবর্তনের কারণ মনে করি না (যেমন ডক্স পরিবর্তন থেকে দেখা গেছে)।

আমি এখন এই পরিবর্তনের একটি ভাল কারণ নিয়ে আসতে পারছি না [...]

এবং এইভাবে আমাদের কাছে এটি রয়েছে: এই অসঙ্গতির পিছনে সুনির্দিষ্ট কারণটি সময়ের সাথে হারিয়ে যায়।

পরিশেষে, নোট করুন যে বাগ রিপোর্টটি প্রত্যাখ্যান করা হয়েছিল: নেতৃস্থানীয় শূন্যগুলি কেবল পাইথন ৩.x এর জন্য কেবল শূন্য পূর্ণসংখ্যায় গ্রহণযোগ্য হবে।


6
আপনি কেন বলেন যে "আমরা সম্ভবত কখনই ঠিক বুঝতে পারি না কেন জর্জ কেন বেছে নিয়েছিল ..."? যদি তাকে চেনেন এমন কেউ যদি এই থ্রেডটি দেখে এবং তাকে এই সম্পর্কে অবহিত করেন তবে তিনি আসতে পারে তার উত্তর দিতে! (আপনি যদি না জানেন তবে তিনি চিরকাল তাঁর অতীতের পাইথনের কাজ, বা এরকম কিছু পরিস্থিতি নিয়ে আলোচনা করতে অস্বীকার করছেন)
ওয়ালরাস

1
আমি বুঝতে পারছি না কেন তারা কেবল দ্বিতীয় পাইথন 2 octintegerকেস করেনি "0" octdigit*0সি / সি ++ এর একটি অক্টাল আক্ষরিক।
র্যান্ডম 832

1
আসলে ইংরেজি এক্ষেত্রে কিছুটা অস্পষ্ট। "অন্য" শব্দের অর্থ "আরও একটি" বা এর অর্থ "আলাদা" হতে পারে can পিইপি 3127 এর গা from় উদ্ধৃতিটির একটি বৈধ ইংরেজি ব্যাখ্যাটির অর্থ হ'ল "সিন্ট্যাক্সেরর উত্থাপিত হবে যখনই শীর্ষস্থানীয় '0' তত্ক্ষণাত্ '0' ব্যতীত অন্য একটি অঙ্ক দ্বারা অনুসরণ করা হবে" আমি নিশ্চিত নই যে এটি আসলে কী ছিল ( যদিও সেই ব্যাখ্যাটি আসল কোড দ্বারা সমর্থিত বলে মনে হয়), তবে কোনও অবস্থাতেই আমি এই কথাটি সঠিক বলে মনে করি না যে এই বাক্যটির অতিরিক্ত ব্যাখ্যা ছাড়াই পিইপি প্রযুক্তিগতভাবে লঙ্ঘিত হয়েছে।
গ্র্যান্ডওপেনার

2
@ গ্র্যান্ডঅপেনার: নোটটি 001অবৈধ, যদিও আপনার ব্যাখ্যাটি আইনানুগ হতে পারে (যেহেতু "তাত্ক্ষণিক" এর অর্থটি বেশ স্পষ্ট হওয়া উচিত)।
nneonneo

ভাল যুক্তি. সুতরাং পিইপি অবশ্যই লঙ্ঘিত হয়; যা অস্পষ্ট তা হ'ল প্রকৃতি যেখানে এটি লঙ্ঘিত হয়েছে। :)
গ্র্যান্ডওপেনার

17

এটি একটি বিশেষ কেস ( "0"+)

2.4.4। পূর্ণসংখ্যার আক্ষরিক

পূর্ণসংখ্যার আক্ষরিক নীচের বর্ণনামূলক সংজ্ঞা দ্বারা বর্ণিত হয়:

পূর্ণসংখ্যা :: = ডেসিম্যালিনটেজার | অক্টিনটেগার | hexinteger | bininteger
ডেসিমালিনটেগার :: = ননজারডজিট ডিজিট * | "0" + +
ননজারডিজিট :: = "1" ... "9"
সংখ্যা :: = "0" ... "9"
octinteger :: = "0" ("ও" | "ও") অক্টিটজিট +
hexinteger :: = "0" ("x" | "এক্স") হেক্সডিজিট +
বিনিনটেগার :: = "0" ("বি" | "বি") বিন্দিগিত +
octdigit :: = "0" ... "7"
হেক্সডিজিট :: = ডিজিট | "ক" ... "চ" | "একজন" ... "এফ"
বিন্দিগিত :: = "0" | "1"

আপনি যদি ব্যাকরণের দিকে তাকান, এটি দেখতে খুব সহজ যে এটি 0একটি বিশেষ ক্ষেত্রে প্রয়োজন। +যদিও ' ' 'সেখানে প্রয়োজনীয় বিবেচিত হয়েছে তা আমি নিশ্চিত নই । ডেভ মেইলিং তালিকাটি খননের সময় ...


আকর্ষণীয়ভাবে লক্ষণীয় যে পাইথন 2 এ একাধিককে 0পার্স হিসাবে চিহ্নিত করা হয়েছিল octinteger(শেষ ফলাফলটি এখনও রয়েছে 0)

ডেসিমালিনটেগার :: = ননজারডজিট ডিজিট * | "0"
octinteger :: = "0" ("ও" | "ও") অক্টিটজিট + | "0" অষ্টডিজিট +

1
এবং কোন ধারণা কেন আছে "0"+এবং নেই "0"?
লেজলট

1
@ লেজলট, এখনও নয় - তবে আমি আগ্রহী। এটি অবশ্যই অনুমানের অংশ
জন লা রুই

3

পাইথন 2 অষ্টাল সংখ্যা নির্দিষ্ট করতে অগ্রণী শূন্য ব্যবহার করেছে:

>>> 010
8

এই (? বিভ্রান্তিকর) আচরণ এড়াতে, Python3 স্পষ্ট উপসর্গ প্রয়োজন 0b, 0o, 0x:

>>> 0o10
8

15
প্রশ্নটি রয়ে গেছে: কেন 00অনুমতি দেওয়া হচ্ছে? (এবং 000, 0000ইত্যাদি)
মাইকেল জেরি

4
@ মিশেলগিরি: সম্ভবত কারণ এটি অস্পষ্ট হতে পারে না (00000000 বেসটি নির্বিশেষে 0 হয়) এবং এটি অপসারণের অকারণে কোড ভঙ্গ হবে? এখনও অদ্ভুত।
রিমকো জারলিচ

5
@ রেমকো গ্রিলিচ যদি আমি ভুল না হয় তবে তা বেস নির্বিশেষে 01is 1
হল্ট

2
@ হোল্ট: তবে "0" + "1" কে অনুমতি দিচ্ছেন? একটি বিশেষ ক্ষেত্রে সম্ভবত আরও বিভ্রান্তিকর হবে।
রিমকো জারলিচ

4
@ রেমকো গ্রিলিচ কখনই বলেননি এটি হবে না;) আমি কেবল বলছিলাম যে এটি can't be ambiguousকোনও যুক্তি নয় যেহেতু অস্পষ্টও 01হতে পারে না। আইএমও, কেসটি 00কেবল একটি বিশেষ কেস কারণ এটি 0হওয়া উচিত নয়।
হল্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.