পাইথনের স্ট্রিং ফর্ম্যাটিংয়ের অনেকগুলি উপায় - কী পুরানোগুলি (থাকা যাচ্ছে) হ্রাস করা হয়েছে?


106

পাইথনের স্ট্রিং ফর্ম্যাট করার কমপক্ষে ছয়টি উপায় রয়েছে:

In [1]: world = "Earth"

# method 1a
In [2]: "Hello, %s" % world
Out[2]: 'Hello, Earth'

# method 1b
In [3]: "Hello, %(planet)s" % {"planet": world}
Out[3]: 'Hello, Earth'

# method 2a
In [4]: "Hello, {0}".format(world)
Out[4]: 'Hello, Earth'

# method 2b
In [5]: "Hello, {planet}".format(planet=world)
Out[5]: 'Hello, Earth'

# method 2c
In [6]: f"Hello, {world}"
Out[6]: 'Hello, Earth'

In [7]: from string import Template

# method 3
In [8]: Template("Hello, $planet").substitute(planet=world)
Out[8]: 'Hello, Earth'

বিভিন্ন পদ্ধতির সংক্ষিপ্ত ইতিহাস:

  • printfস্টাইল ফর্ম্যাটিংটি পাইথন শৈশবকাল থেকেই ছিল
  • Templateবর্গ পাইথন 2.4 চালু হয়
  • formatপাইথন ২.6 এ পদ্ধতিটি চালু হয়েছিল
  • f-স্ট্রিংগুলি পাইথন ৩.6-এ প্রবর্তিত হয়েছিল

আমার প্রশ্নগুলি হ'ল:

  • হয় printf-style ফর্ম্যাটিং অবচিত বা অননুমোদিত হতে যাচ্ছে?
  • -এ Template class, substituteপদ্ধতিটি হ্রাস করা হচ্ছে বা হ্রাস করা হবে? (আমি কথা বলছি না safe_substitute, যা আমি বুঝতে পেরেছি এটি অনন্য ক্ষমতা দেয়)

অনুরূপ প্রশ্ন এবং কেন আমি মনে করি সেগুলি সদৃশ নয়:

আরো দেখুন


1
আপনি কি Formatterক্লাস ভুলে গেছেন তা বোঝানোর দরকার নেই?
মার্টিজন পিটারস

উত্তর:


14

ডকগুলিতে বিভিন্ন ইঙ্গিত রয়েছে যে .formatএবং এফ-স্ট্রিংগুলি স্ট্রিংয়ের চেয়ে উচ্চতর, এরপরেরটিকে হ্রাস করার %মতো কোনও বেঁচে থাকার পরিকল্পনা নেই।

অঙ্গীকার # 14123 ইস্যুতে: স্পষ্টভাবে উল্লেখ করুন যে পুরানো স্টাইল% স্ট্রিং ফর্ম্যাটিংয়ে সতর্কতা রয়েছে তবে খুব শীঘ্রই কোনও সময় চলে যাচ্ছে না। , ইস্যু দ্বারা অনুপ্রাণিত হয়ে ইঙ্গিত করুন যে% প্রিন্টফ -স্টাইল বিন্যাসকে হ্রাস করার জন্য বর্তমান কোনও পরিকল্পনা নেই , ফরম্যাটিং- এ ডকসগুলি এই বাক্যাংশটি সংরক্ষণ করার জন্য সম্পাদনা করা হয়েছিল:

যেহেতু নতুন স্ট্রিং-ফর্ম্যাট সিনট্যাক্সটি আরও নমনীয় এবং প্রাকৃতিকভাবে টিপলস এবং অভিধানগুলি পরিচালনা করে, তাই এটি নতুন কোডের জন্য প্রস্তাবিত। তবে মুদ্রণ-শৈলীর বিন্যাসকে হ্রাস করার জন্য বর্তমান কোনও পরিকল্পনা নেই

(জোর আমার।)

এই বাক্যাংশটি পরে বন্ধ করা হয়েছে, বন্ধ করুন # 4966: আধুনিক পাইথনের অবস্থা আরও ভালভাবে ব্যাখ্যা করার জন্য ক্রম ডকগুলি পুনর্নির্মাণ করুন । এটি চিহ্নের মতো মনে হতে পারে যে %ফর্ম্যাটিংকে হ্রাস করার পরিকল্পনাটি কার্ডগুলিতে ফিরে এসেছিল ... তবে বাগ ট্র্যাকারে ডুব দিয়ে জানা যায় যে উদ্দেশ্যটি বিপরীত ছিল। বাগ যে ব্যক্তি অনুসরণ করে তারিখে, কমিট লেখক পরিবর্তন চরিত্রকে এভাবে :

  • প্রিন্টফেল-স্টাইল বিন্যাস এবং স্ট্রিং ফর্ম্যাট পদ্ধতির মধ্যে সম্পর্কের বর্ণনা দেয় এমন গদ্য বদলেছে (ইচ্ছাকৃতভাবে এই প্রবণতাটি সরিয়ে দেওয়া হয়েছে যে প্রাক্তন নিখোঁজ হওয়ার যে কোনও সত্য বিপদ - এটি কেবল আমাদের মারাত্মকভাবে হত্যা করার জন্য চিন্তাভাবনা করা বাস্তব নয়)

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

আরও কী, এই অনুচ্ছেদে সর্বাধিক সাম্প্রতিক পরিবর্তন , মার্চ 2017 এ, এটিকে এটি থেকে পরিবর্তন করেছে ...

এখানে বর্ণিত ফর্ম্যাটিং ক্রিয়াকলাপগুলি বিভিন্ন ধরণের স্পিকারগুলি প্রদর্শন করে যা বেশ কয়েকটি সাধারণ ত্রুটি বাড়ে (যেমন টিউপস এবং অভিধান সঠিকভাবে প্রদর্শন করতে ব্যর্থ হয়)। আরও নতুন ফর্ম্যাট স্ট্রিং লিটারেল বা str.formatইন্টারফেস ব্যবহার করা এই ত্রুটিগুলি এড়াতে সহায়তা করে। এই বিকল্পগুলি পাঠ্যের বিন্যাসে আরও শক্তিশালী, নমনীয় এবং এক্সটেনসিবল পন্থা সরবরাহ করে।

... এটি:

এখানে বর্ণিত ফর্ম্যাটিং ক্রিয়াকলাপগুলি বিভিন্ন ধরণের স্পিকারগুলি প্রদর্শন করে যা বেশ কয়েকটি সাধারণ ত্রুটি বাড়ে (যেমন টিউপস এবং অভিধান সঠিকভাবে প্রদর্শন করতে ব্যর্থ হয়)। আরও নতুন ফর্ম্যাটেড স্ট্রিং লিটারেলস, str.formatইন্টারফেস বা টেম্পলেট স্ট্রিংগুলি এই ত্রুটিগুলি এড়াতে সহায়তা করতে পারে। এই বিকল্পগুলির প্রত্যেকটি তাদের নিজস্ব বাণিজ্য-অফস এবং সরলতা, নমনীয়তা এবং / অথবা এক্সটেনসিবিলিটির সুবিধা দেয়।

পরিবর্তন লক্ষ্য করুন থেকে "মে সাহায্যের এড়ানোর" থেকে "এড়িয়ে চলতে সাহায্য করে", এবং কিভাবে সুস্পষ্ট সুপারিশ .formatএবং F-স্ট্রিং কিভাবে প্রতিটি শৈলী সম্পর্কে ফুঁয়োফুঁয়ো, সন্দেহজনক গদ্য দ্বারা প্রতিস্থাপিত হয়েছে "তাদের নিজস্ব বিনিময় প্রথা এবং বেনিফিট প্রদান করে" । এটি হ'ল কেবল কার্ডগুলিতে একটি আনুষ্ঠানিক অবমূল্যায়ন নয়, তবে বর্তমান ডক্সগুলি খোলামেলাভাবে স্বীকার করে %নিচ্ছে যে অন্যান্য পদ্ধতির তুলনায় ফর্ম্যাটটির কমপক্ষে কিছু "সুবিধা" রয়েছে।

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


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

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

58

নতুন .format()পদ্ধতিটি পুরানো %ফর্ম্যাটিং সিনট্যাক্স প্রতিস্থাপন বোঝানো হয়েছে । পরবর্তীটি ডি-জোর করা হয়েছে, (তবে আনুষ্ঠানিকভাবে এখনও হ্রাস হয়নি )। পদ্ধতি ডকুমেন্টেশন যতটা বলে:

স্ট্রিং ফর্ম্যাটিংয়ের এই পদ্ধতিটি পাইথন 3 এ নতুন মান, এবং নতুন কোডে স্ট্রিং ফর্ম্যাটিং অপারেশনগুলিতে বর্ণিত ফর্ম্যাটিংয়ের পক্ষে পছন্দ করা উচিত%

(জোর আমার)।

পিছনের সামঞ্জস্যতা বজায় রাখতে এবং রূপান্তর সহজ করার জন্য, পুরানো ফর্ম্যাটটি আপাতত রেখে দেওয়া হয়েছে । মূল পিইপি 3101 প্রস্তাব থেকে :

পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্যপূর্ণ

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

পুরানো সিস্টেমটিকে অবমূল্যায়নের সময় না আসা পর্যন্ত নোট করুন ; এটি অবহেলা করা হয়নি, আপনি যখনই নতুন কোড লিখবেন তখন নতুন সিস্টেমটি ব্যবহার করা হবে ।

নতুন সিস্টেমে একটি সুবিধা রয়েছে যে আপনি পুরানো ফর্ম্যাটারের টিপল এবং ডিকশনারি পদ্ধতির সমন্বয় করতে পারেন %:

"{greeting}, {0}".format(world, greeting='Hello')

এবং object.__format__()স্বতন্ত্র মানগুলির বিন্যাসকরণ পরিচালনা করতে ব্যবহৃত হুকের মাধ্যমে প্রসারিত ible

নোট করুন যে পুরানো সিস্টেমটি ছিল %এবং Templateশ্রেণি ছিল, যেখানে পরবর্তীটি আপনাকে এমন সাবক্লাস তৈরি করতে দেয় যা এর আচরণ যুক্ত করে বা পরিবর্তন করতে পারে। নতুন স্টাইলের সিস্টেমে একই কুলুঙ্গিটি পূরণ করার Formatterক্লাস রয়েছে ।

পাইথন 3 আরও অবচয় থেকে দূরে সরে গেছে, পরিবর্তে printfস্টাইল স্ট্রিং বিন্যাস বিভাগে আপনাকে সতর্ক করে দিয়েছে :

দ্রষ্টব্য : এখানে বর্ণিত ফর্ম্যাটিং ক্রিয়াকলাপগুলি বিভিন্ন ধরণের স্পিকারগুলি প্রদর্শন করে যা বেশ কয়েকটি সাধারণ ত্রুটি বাড়ে (যেমন টিউপস এবং অভিধান সঠিকভাবে প্রদর্শন করতে ব্যর্থ হয়)। আরও নতুন ফর্ম্যাট স্ট্রিং লিটারেল বা str.format()ইন্টারফেস ব্যবহার করা এই ত্রুটিগুলি এড়াতে সহায়তা করে। এই বিকল্পগুলি পাঠ্যের বিন্যাসে আরও শক্তিশালী, নমনীয় এবং এক্সটেনসিবল পন্থা সরবরাহ করে।

পাইথন 3.6 আরও যোগ করেছেন বিন্যস্ত স্ট্রিং লিটারেল , যা ইন-লাইন এক্সপ্রেশন মধ্যে বিন্যাস স্ট্রিং। এগুলি আন্তঃবিবাহিত মানগুলির সাথে স্ট্রিং তৈরির দ্রুততম পদ্ধতি এবং str.format()আপনি যেখানে আক্ষরিক ব্যবহার করতে পারবেন তার পরিবর্তে ব্যবহার করা উচিত ।


4
এবং Formatterআপনার সাহায্যে কাস্টম ফর্ম্যাট তৈরি করা যায় যেমন datetimeবস্তুগুলি ব্যবহার করে। এছাড়াও, যেহেতু .formatএকটি ফাংশন তাই আপনি এটিকে আরও সরাসরি কলযোগ্য অলস ফর্ম্যাটিং তৈরি করতে ব্যবহার করতে পারেন: যেমন,fmt = '{} - {}'.format; fmt(a, b)
জন ক্লিমেটস

আমি দেখতে পাচ্ছি না কিভাবে Templateসঙ্গে সম্পর্কযুক্ত %বা পুরাতন সিস্টেম । বিশেষত আপনি পিইপি রাজ্যগুলিকে সংযুক্ত করেন যখন এই প্রস্তাবের মধ্যে কিছুটা ওভারল্যাপ রয়েছে এবং string.Templateএটি অনুভূত হয় যে প্রত্যেকে একটি পৃথক প্রয়োজন পরিবেশন করে এবং এটি অন্যটিকে অপসারণ করে না। আপনার উত্তরে কেউ বিভ্রান্ত হতে পারে যে পুরানো সিস্টেমেরTemplate অংশ হয়ে ফর্ম্যাটিংটিও হ্রাস পেয়েছে।
বাকুরিউ

@ বাকুরিউ: ঠিক আছে, আমি মনে করি আমি সেই অংশটি মিস করেছি; তবে আমার মতে Formatterশ্রেণি একই চাহিদা পূরণ করতে পারে string.Template()
মার্টিজন পিটারস

1
[...]should be preferred to the % formatting[...]এই অংশটি ডকুমেন্টেশন থেকে সরানো হয়েছে। docs.python.org/3/library/stdtyype.html#str.format
এক্সো

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

45

%স্ট্রিং বিন্যাস করার জন্য অপারেটর অবচিত নয়, এবং মুছে ফেলা হতে যাচ্ছে না - অন্য উত্তর সত্ত্বেও।
প্রতিবার পাইথন বিকাশের তালিকায় যখন বিষয়টি উত্থাপিত হয় তখন তীব্র বিতর্ক হয় যার উপরে আরও ভাল, তবে ক্লাসিক উপায়ে সরাতে হবে কিনা তা নিয়ে কোনও বিতর্ক নেই - এটি থেকে যাবে। পিইপি 3101 তে চিহ্নিত হওয়া সত্ত্বেও পাইথন ৩.১ এসেছিল এবং চলে গেছে, এবং %ফর্ম্যাটিংটি এখনও প্রায় রয়েছে।

রাখার ক্লাসিক স্টাইলের বিবৃতিগুলি পরিষ্কার: এটি সহজ, এটি দ্রুত, ছোট জিনিসগুলির জন্য এটি দ্রুত is .formatপদ্ধতিটি ব্যবহার করা সবসময় বেশি পঠনযোগ্য নয় - এবং সবেমাত্র যে কেউ - এমনকি মূল বিকাশকারীদের .formatমধ্যেও, রেফারেন্সটি না দেখিয়ে সরবরাহ করা সম্পূর্ণ বাক্য গঠন ব্যবহার করতে পারেন এমনকি ২০০৯ সালেও , এই জাতীয় বার্তা ছিল: http: // মেল। python.org/pipermail/python-dev/2009- অক্টোবর / 092529 এইচটিএমএল - তখন থেকেই বিষয়গুলি তালিকাগুলিতে সবেমাত্র প্রকাশিত হয়েছিল।

2016 আপডেট

বর্তমান পাইথন ডেভলপমেন্ট সংস্করণে (যা পাইথন ৩.6 হয়ে যাবে) পিইপি -৪৯৯৮ এ বর্ণিত স্ট্রিং ইন্টারপোলেশনের তৃতীয় পদ্ধতি রয়েছে । এটি একটি নতুন উদ্ধৃতি উপসর্গ সংজ্ঞায়িত f""(বর্তমান ব্যতীত u"", b""এবং r"")।

স্ট্রিংটির পূর্বনির্ধারণ fরানটাইমের সময় স্ট্রিং অবজেক্টে এমন একটি পদ্ধতি কল করবে যা বর্তমান স্কোপ থেকে স্ট্রিংয়ে স্বয়ংক্রিয়ভাবে ভেরিয়েবলগুলি বিভক্ত করবে:

>>> value = 80
>>> f'The value is {value}.'
'The value is 80.'

3
প্রকারগুলিকে তাদের নিজস্ব বাস্তবায়নের অনুমতি দেওয়ার পক্ষে এটি খুব সুন্দর __format__। উদাহরণস্বরূপ, format(Decimal('0.1'), '.20f')বনাম '%.20f' % Decimal('0.1')। পরেরটি দশমিক দশকে একটি ভাসাতে প্রবাহিত করে।
এরিক সান

2
বিশেষ দ্রষ্টব্য। আমি তর্ক করিনি যে পুরানো শৈলী সর্বদাই ভাল - কেবল এটি ছোট এবং কখনও কখনও আরও বেশি পাঠযোগ্য (এবং কখনও কখনও না)। অবশ্যই নতুন উপায়টি অনেক বেশি নমনীয়।
jsbueno

fপাইথন 3 এর সমতুল্য কি আছে ?
ড্যানিয়েল

f-stringsউপরের হিসাবে ব্যবহৃত পাইথন 3.6 হিসাবে ভাষায় নতুন বৈশিষ্ট্য আছে। এটি পূর্ববর্তী সংস্করণগুলিতে বিদ্যমান নেই এবং সেগুলির জন্য একটি সিনট্যাক্স ত্রুটি বাড়িয়ে তুলবে।
jsbueno

20

এটি সম্পর্কে গিডোর সর্বশেষ অবস্থানটি এখানে ইঙ্গিত করা হয়েছে বলে মনে হচ্ছে:

পাইথন 3.0 এ নতুন কী

পিইপি 3101: স্ট্রিং বিন্যাসে একটি নতুন পদ্ধতির Appro

অন্তর্নির্মিত স্ট্রিং বিন্যাসকরণ ক্রিয়াকলাপের জন্য একটি নতুন সিস্টেম% স্ট্রিং বিন্যাস অপারেটরকে প্রতিস্থাপন করে। (তবে,% অপারেটর এখনও সমর্থিত; এটি পাইথন ৩.১ এ অবমূল্যায়ন করা হবে এবং পরবর্তী সময়ে ভাষা থেকে সরানো হবে)) সম্পূর্ণ স্কুপের জন্য পিইপি 3101 পড়ুন।

এবং পিইপি 3101 নিজেই, যা শেষ পরিবর্তনটি ডেট হয়েছে (শুক্র, 30 সেপ্টেম্বর 2011), তাই এর ফলে আর কোনও অগ্রগতি হয়নি বলে আমি মনে করি।


18

পুরানো পাইথন ডক্স এবং পিইপি 3101 এর দিকে তাকিয়ে একটি বিবৃতি ছিল যে% অপারেটরকে ভবিষ্যতে ভাষা থেকে অবজ্ঞা করা হবে এবং সরানো হবে। নিম্নোক্ত বিবৃতি পাইথন 3.0, 3.1, এবং 3.2 জন্য পাইথন ডক্সে ছিল:

Str.format () বেশ নতুন, তাই পাইথন কোড প্রচুর এখনও% অপারেটর ব্যবহার করে। তবে, কারণ এই পুরানো শৈলীর বিন্যাসটি ভাষা থেকে শেষ পর্যন্ত মুছে ফেলা হবে, str.format () সাধারণত ব্যবহার করা উচিত।

আপনি যদি পাইথন ৩.৩ এবং ৩.৪ ডক্সে একই বিভাগে যান , আপনি দেখতে পাবেন যে বিবৃতিটি সরানো হয়েছে। অপারেটরটিকে ভাষা থেকে অবহেলা করা হবে বা সরানো হবে এমন ইঙ্গিত করে নথিতে অন্য কোথাও আমি অন্য কোনও বিবৃতি পাই না। এটিও লক্ষণীয় গুরুত্বপূর্ণ যে আড়াই বছর ধরে পিইপি 3101 সংশোধন করা হয়নি (শুক্র, 30 সেপ্টেম্বর 2011)

হালনাগাদ

পিইপি ৪61১ বাইটস এবং বাইটারিতে% ফর্ম্যাটিং যুক্ত করা গ্রহণযোগ্য এবং এটি পাইথনের 3.5 বা 3.6 এর অংশ হওয়া উচিত। এটি অপর একটি চিহ্ন যে% অপারেটর বেঁচে আছেন এবং লাথি মারছেন।

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