অজগর মধ্যে int () এর পাল্টা আচরণ


83

ডক্সে এটি স্পষ্টভাবে বলা হয়েছে যে int (সংখ্যা) একটি মেঝে ধরণের রূপান্তর:

int(1.23)
1

এবং int (স্ট্রিং) একটি int প্রদান করে যদি এবং কেবল যদি স্ট্রিংটি পূর্ণসংখ্যা হয়।

int('1.23')
ValueError

int('1')
1

এর কোন বিশেষ কারণ আছে কি? আমি এটিকে বিপরীতমুখী বলে মনে করি যে ফাংশনটি এক ক্ষেত্রে মেলে তবে অন্যটি নয়।

উত্তর:


123

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

int(some_string)একটি স্ট্রিংটিকে পূর্ণসংখ্যা বিন্যাসে রূপান্তর করার একটি স্পষ্ট অনুরোধ; এই রূপান্তরটির নিয়মগুলি উল্লেখ করে যে স্ট্রিংটিতে একটি বৈধ পূর্ণসংখ্যার আক্ষরিক উপস্থাপনা থাকতে হবে। int(float)একটি পূর্ণসংখ্যায় একটি ফ্লোট রূপান্তর করার জন্য একটি সুস্পষ্ট অনুরোধ; এই রূপান্তরটির নিয়মগুলি উল্লেখ করে যে ভাসমানটির ভগ্নাংশটি কেটে যাবে।

জন্য জন্য int("3.1459")ফিরে যাওয়ার 3অনুবাদক পরোক্ষভাবে একটি float স্ট্রিং রূপান্তর করতে হবে। পাইথন যেহেতু অন্তর্নিহিত রূপান্তরগুলিকে সমর্থন করে না, এটি পরিবর্তে একটি ব্যতিক্রম বাছাই করে।


type(3)আয় <type int>। তবে পাইথন অভিযোগ করে না float("3")। পাইথন কি স্পষ্টভাবে স্ট্রিংটিকে কোনও int এবং তারপরে একটি ফ্লোটে রূপান্তর করছে না?
ফ্রাঙ্কস্যান্ড

"3" হ'ল একটি বৈধ ভাসমান-পয়েন্ট মান হ'ল যদিও এটি একটি প্রোগ্রাম আক্ষরিক হিসাবে এটি পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করা হবে। কোনও পূর্ণসংখ্যার রূপান্তর প্রয়োজন।
হোল্ডেনওয়েব

75

এটি প্রায় অবশ্যই পাইথনের জেন থেকে তিনটি মূলনীতির প্রয়োগের ক্ষেত্রে :

সুস্পষ্ট আরও ভাল অন্তর্নিহিত।

[...] বাস্তবতা বিশুদ্ধতা বীট

ত্রুটিগুলি কখনই নিঃশব্দে কাটানো উচিত নয়

সময়ের কিছু শতাংশ, কেউ করছেন int('1.23')তাদের ব্যবহারের ক্ষেত্রে ভুল রূপান্তর কল করছে এবং তার মতো floatবা decimal.Decimalপরিবর্তে কিছু চাইছে । এই ক্ষেত্রে, নিঃশব্দে ভুল মূল্য দেওয়ার পরিবর্তে তাত্ক্ষণিক ত্রুটি যা তারা ঠিক করতে পারে তা তাদের পক্ষে পরিষ্কারভাবে ভাল।

কেস যাতে আপনি সম্ভবত না আরোপ করা করতে চান যে কোন int, এটা তুচ্ছ হয় স্পষ্টভাবে এটি মাধ্যমে ক্ষণস্থায়ী দ্বারা তা করার floatপ্রথম, এবং তারপর অপরকে আহ্বানের int, round, trunc, floorবা ceilযথাযথ হিসাবে। এই পরবর্তী পরিমার্জন "সংশোধন" একটি প্রকল্পিত চুপটি-ছিন্ন বিরুদ্ধে পাহারা আপনার কোড আরো স্ব-দলিল করে তোলে, intথেকে কল floatএটা পরিষ্কার বৃত্তাকার মান করে হয় কি আপনি চান।


আমি মনে করি জেন ​​গঠনের অনেক আগেই এই নীতিগুলি গৃহীত হয়েছিল, তবে উভয় ক্ষেত্রেই উভয়ই সামঞ্জস্যপূর্ণ বলে মনে হবে।
হোল্ডেনওয়েব

17

কখনও কখনও একটি চিন্তার পরীক্ষা দরকারী হতে পারে।

  • আচরণ এ: int('1.23')একটি ত্রুটি দিয়ে ব্যর্থ। এটি বিদ্যমান আচরণ।
  • আচরণ বি: ত্রুটি ছাড়াই int('1.23')উত্পাদন করে 1। এটিই আপনি প্রস্তাব করছেন।

আচরণ এ এর ​​সাথে, আচরণ বি এর প্রভাব পেতে এটি সোজা এবং তুচ্ছ: এর int(float('1.23'))পরিবর্তে ব্যবহার করুন।

অন্যদিকে, আচরণ বি এর সাথে, আচরণের এ অর্জনের বিষয়টি উল্লেখযোগ্যভাবে জটিল:

def parse_pure_int(s):
    if "." in s:
        raise ValueError("invalid literal for integer with base 10: " + s)
    return int(s)

(এবং উপরের কোডটি সহ, আমারও পুরোপুরি আস্থা নেই যে কোথাও কোথাও কেস কেসটি ক্ষতিগ্রস্থ করে না isn't

আচরণ A এ আচরণ বি এর চেয়ে বেশি অভিব্যক্তিপূর্ণ is

আরেকটি বিষয় বিবেচনা করুন: '1.23'হ'ল ভাসমান-পয়েন্ট মানের একটি স্ট্রিং প্রতিনিধিত্ব। রূপান্তর '1.23'একটি পূর্ণসংখ্যা ধারণার দিক থেকে দুই ধর্মান্তর (পূর্ণসংখ্যা থেকে ভাসা স্ট্রিং) জড়িত থাকে, কিন্তু int(1.23)এবং int('1')প্রতিটি কেবল একটি রূপান্তর জড়িত।


সম্পাদনা করুন:

এবং প্রকৃতপক্ষে, কোণার কেস রয়েছে যে উপরের কোডটি পরিচালনা করবে না: 1e-2এবং 1E-2উভয়ই ভাসমান পয়েন্টের মান।


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

4
কর্নার কেস হতে পারে int('123E-2')বা int('1L')
জ্যারেড গোগুয়েন

11

সহজ কথায় - এগুলি একই ফাংশন নয়।

  • int (দশমিক) 'ফ্লোর হিসাবে আচরণ করে যেমন দশমিক অংশ ছিটকে এবং int হিসাবে ফিরে আসে'
  • int (স্ট্রিং) এরূপ আচরণ করে যে 'এই পাঠ্যটি একটি পূর্ণসংখ্যার বর্ণনা করে, এটিকে রূপান্তর করে পূর্বাবস্থায় ফিরে আসে'।

এগুলি একই নামের 2 টি পৃথক ফাংশন যা কোনও পূর্ণসংখ্যা ফেরত দেয় তবে তারা পৃথক ফাংশন।

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

তারা একই বা সম্মিলিত কার্যকারিতা সরবরাহ করছে এমন কোনও প্রভাব নেই, তাদের কেবল একই নাম রয়েছে এবং একই ধরণের ফিরে আসবে। এগুলিকে খুব সহজেই 'ফ্লোরডিসিমাল এএসআইএন্ট' এবং 'রূপান্তর স্ট্রিংটোইন্ট' নামে অভিহিত করা যেতে পারে তবে তারা 'ইনট' এর পক্ষে গিয়েছিল কারণ এটি মনে রাখা সহজ, (99%) স্বজ্ঞাত এবং বিভ্রান্তি খুব কমই ঘটত।

পাঠ্যের জন্য পাঠ্যকে পূর্ণসংখ্যা হিসাবে পার্স করা যাতে দশমিক বিন্দু যেমন "4.5" অন্তর্ভুক্ত হয় কম্পিউটারের বেশিরভাগ ভাষায় একটি ত্রুটি ঘটায় এবং সংখ্যাগরিষ্ঠ প্রোগ্রামারদের দ্বারা একটি ত্রুটি ছুঁড়ে ফেলার আশা করা যায় , কারণ পাঠ্য-মানটি পূর্ণসংখ্যাকে উপস্থাপন করে না এবং বোঝায় যে তারা ভ্রান্ত তথ্য সরবরাহ করছে


4
তাহলে দুটি 'বিভিন্ন ফাংশন' এর একই নামটি কেন হয়? কিছু জেন বাজে কথা লঙ্ঘনের মতো শোনাচ্ছে।
হাবস

কারণ নামটি 2 টি পৃথক ক্রিয়াকলাপটিকে বোঝায় এবং এটি সংহত হয়। ইন্ট-ইফি একটি দশমিক (তল), একটি স্ট্রিংকে একটি int (রূপান্তর) এ রূপান্তর করুন

প্রযুক্তিগতভাবে এটি মনে রাখতে সাহায্য করতে পারে যে intএটি একটি প্রকার (এবং এর মধ্যে একটি অন্তর্নির্মিত)। এর স্রষ্টা ( __new__) বেশ কয়েকটি সম্ভাব্য আর্গুমেন্টের ধরণ নেয়। প্রতিটি ধরণের জন্য এর আচরণটি সু-সংজ্ঞায়িত।
হোল্ডেনওয়েব

এই উত্তরটি যেমন বলা হয়েছে তেমনই ভুল। intপ্রকৃতপক্ষে কোনও ফাংশন নয় বরং এটি একটি প্রকার, যার __new__এবং __init__পদ্ধতিগুলি স্ট্রিং বা ভাসমান যুক্তি গ্রহণ করে, প্রতিটিটির সাথে যথাযথভাবে আচরণ করে। এটি আরও সঠিক হবে যে প্রকারটি দুটি আর্গুমেন্ট প্রকারকে আলাদাভাবে প্রক্রিয়া করে তবে কেবল একটিই int
হোল্ডেনওয়েব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.