রুবির স্ট্রিং ইন্টারপোলেশনের সমকক্ষ পাইথন কি আছে?


343

রুবি উদাহরণ:

name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."

পাইথনের সফল স্ট্রিং কনটেন্টেশনটি আমার কাছে আপাতদৃষ্টিতে ভার্জোজ।


2
এখানে সমস্যাটি হ'ল nameস্ট্রিংয়ে থাকা একটি স্থানীয় ভেরিয়েবল এবং পাইথনে আপনাকে স্পষ্টভাবে স্থানীয় ভেরিয়েবলের অভিধানটি স্ট্রিং ফর্ম্যাটারে দিতে হবে যদি আপনি এটি ব্যবহার করতে চান।
ক্যাট্রিয়েল

এটি মূল সমস্যা ছিল না, তবে ধন্যবাদ। আপনার মন্তব্য আমাকে ভেরিয়েবল স্কোপটি সম্পর্কে কিছুটা আরও ভাল বোঝার সুযোগ দিয়েছে (এমন কিছু যা আমি এখনও স্থির করছি)। :)
জাতি

1
তাহলে আপনি এই সম্পর্কে কি মনে করেন? stackoverflow.com/questions/16504732/...
SalchiPapa

PEP 215 - STRING ক্ষেপক - দ্বারা বাতিল করা python.org/dev/peps/pep-0292
Mr_and_Mrs_D

2
দেখুন stackoverflow.com/a/33264516/55721 মধ্যে 3.6 ঠিক এই বৈশিষ্ট্যের জন্য
dss539

উত্তর:


413

পাইথন ৩.6 রুবির স্ট্রিং ইন্টারপোলেশনের অনুরূপ আক্ষরিক স্ট্রিং ইন্টারপোলেশন যুক্ত করবে । পাইথনের সেই সংস্করণটি দিয়ে শুরু করে (যা ২০১ 2016 সালের শেষের দিকে প্রকাশিত হওয়ার কথা রয়েছে), আপনি "এফ-স্ট্রিংস", যেমন উদ্যানগুলিতে অন্তর্ভুক্ত করতে সক্ষম হবেন

name = "Spongebob Squarepants"
print(f"Who lives in a Pineapple under the sea? {name}.")

3.6 এর আগে, আপনি এটির নিকটতমতম স্থানটি পেতে পারেন

name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? %(name)s." % locals())

%অপারেটর ব্যবহার করা যেতে পারে স্ট্রিং ক্ষেপক পাইথন হবে। প্রথম অপারেন্ডটি ইন্টারপোল্ট করার জন্য স্ট্রিং, দ্বিতীয়টিতে "ম্যাপিং" সহ বিভিন্ন ধরণের মান থাকতে পারে, ক্ষেত্রের নামগুলি মান দ্বারা ইন্টারপোল্ট করা যেতে পারে। এখানে আমি স্থানীয় ভেরিয়েবলের locals()ক্ষেত্রের নামটি nameমান হিসাবে স্থানীয় ভেরিয়েবলের অভিধান ব্যবহার করি ।

.format()সাম্প্রতিক পাইথন সংস্করণগুলির পদ্ধতি ব্যবহার করে একই কোডটি দেখতে দেখতে এটি দেখতে পাবেন:

name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? {name!s}.".format(**locals()))

রয়েছে string.Templateশ্রেণী:

tmpl = string.Template("Who lives in a Pineapple under the sea? $name.")
print(tmpl.substitute(name="Spongebob Squarepants"))

@ ক্যাসেটটি এখানে দেখুন: docs.python.org/library/stdtyype.html#string- ফর্ম্যাট করা এবং আপনার আরও বিশদ প্রয়োজন হলে একটি ফলোআপ মন্তব্য পোস্ট করুন
মাইকেজ

আমি এর মূল সূচনাটি বুঝতে পারি, ডকুমেন্টেশনের উদাহরণে পাওয়া সমস্ত অতিরিক্ত চিহ্ন এবং পাঠ্য আমি পুরোপুরি বুঝতে পারি না। এখানে স্ট্রিংয়ে রূপান্তরকরণের ব্যবহার:% (ভাষা) গুলি '03 ডি' তে 3 কী বোঝায়? স্ট্রিংয়ের পরে% \ কেন? মুদ্রণ প্রকাশের পরে ভেরিয়েবলের অ্যাসাইনমেন্ট (যদি তারা প্রকৃত পরিবর্তনশীল হয়) আমাকেও বিভ্রান্ত করে। দুঃখিত যদি এই ব্যথা হয়!
জাতি

1
উদাহরণে ব্যবহৃত দুটি বেসিক ফর্ম্যাটগুলি %sএকটি স্ট্রিংয়ের %03dজন্য এবং নেতৃস্থানীয় শূন্যগুলির সাথে 3 সংখ্যায় প্যাড করা সংখ্যার জন্য। এটা শুধু লেখা যেতে পারে print "%s has %03d" % ("Python", 2)। উদাহরণস্বরূপ বন্ধনীগুলিতে ম্যাপিং কীটি ব্র্যাককেটে রাখার পরে এটি ব্যবহৃত হয় %যা প্লেসগুলিকে স্ট্রিংয়ে তাদের অর্ডারের উপর নির্ভর না করে অর্থপূর্ণ নাম দেওয়ার একটি উপায়। এরপরে আপনি এমন একটি অভিধান পাস করুন যা মূল মানগুলিকে তাদের মানগুলিতে মানচিত্র করে। এই কারণেই সোভেন সেই locals()ফাংশনটি ব্যবহার করছে যা আপনার সমস্ত স্থানীয় ভেরিয়েবলগুলি সম্বলিত একটি ডিকটি ফেরত দেয় তাই এটি nameনামের মানচিত্রটি তৈরি করবে
মাইকেজ

কোনও রূপান্তর ধরণের প্রয়োজনীয় ব্যবহারই আমাকে প্রথমে বিভ্রান্ত করেছিল। সুতরাং, ডকুমেন্টেশন পরিভাষা ব্যবহার করে। % নির্দিষ্টকরণ শুরু করে। (ভাষা) জন্য কোনও রূপান্তর পতাকা নেই, কেবল একটি রূপান্তর প্রকার (পিছনের 'গুলি'); (সংখ্যা) তবে একটি (বা দুটি) রূপান্তর পতাকা রয়েছে যা যথাক্রমে '0' (এবং '3')। 'ডি' হ'ল রূপান্তর ধরণ এবং এটি একটি পূর্ণসংখ্যা হিসাবে চিহ্নিত করে। আমি কি ঠিক বুঝতে পেরেছি?
জাতি

@ কাস্ট: হ্যাঁ, এটি মূলত সঠিক। নোট করুন যে আপনি সর্বদা sরূপান্তর ধরণের হিসাবে একটি ব্যবহার করতে পারেন - পাইথন প্রায় কোনও কিছুকে স্ট্রিতে রূপান্তর করতে পারে। তবে অবশ্যই আপনি অন্যান্য রূপান্তর ধরণের বিশেষ বিন্যাসের ক্ষমতা হারাবেন।
সোভেন মারনাচ

143

পাইথন ২.6. এক্স থেকে আপনি সম্ভবত এটি ব্যবহার করতে চান:

"my {0} string: {1}".format("cool", "Hello there!")

27
লক্ষ্য করুন %স্ট্রিং ক্ষেপক জন্য অপারেটর হয় না পাইথন 3.x. উঠিয়ে docs.python.org/dev/py3k/whatsnew/…% ৩.১ থেকে শুরু করে অবমূল্যায়নের পরিকল্পনা ঘোষণা করে , তবে এটি কখনও ঘটেনি।
সোভেন মারনাচ

8
%-সানট্যাক্সটি পাইথন 3 এ এখনও বেঁচে আছে (পাইথন ৩.২ অনুসারে অবচয় হয়নি)
কোরি গোল্ডবার্গ

9
কেবল একটি নোট: নম্বরটি {}আমাকে দূর করতে পারে।
আঁকুন

32

আমি ইন্টারপি প্যাকেজটি তৈরি করেছি , এটি পাইথনে স্ট্রিং ইন্টারপোলেশন সক্ষম করে

কেবল এটির মাধ্যমে ইনস্টল করুন pip install interpy। এবং তারপরে, # coding: interpyআপনার ফাইলগুলির শুরুতে লাইনটি যুক্ত করুন !

উদাহরণ:

#!/usr/bin/env python
# coding: interpy

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n#{name}."

3
এটি সত্যই অনিরাপদ বলে মনে হচ্ছে।
d33tah

@ d33tah: না, যতক্ষণ না সংকলনের সময় স্ট্রিংগুলি জানা থাকে।
ক্লিমেট

28

পাইথনের স্ট্রিং ইন্টারপোলেশন সি এর প্রিন্টফের মতো ()

যদি তুমি চেষ্টা কর:

name = "SpongeBob Squarepants"
print "Who lives in a Pineapple under the sea? %s" % name

ট্যাগটি ভেরিয়েবলের %sসাথে প্রতিস্থাপন করা হবে name। আপনার মুদ্রণ ফাংশন ট্যাগগুলি একবার দেখে নেওয়া উচিত: http://docs.python.org/library/function.html


1
আমি 2 ভেরিয়েবলের সাহায্যে এইভাবে কীভাবে করতে পারি?
জুলিও মেরিন

16
@JulioMarins একটি tuple ব্যবহার করুন: print "First is %s, second is %s" % (var1, var2)
kirbyfan64sos

28

স্ট্রিং ইন্টারপোলেশন পিইপি 498-তে উল্লিখিত পাইথন 3.6 এর সাথে অন্তর্ভুক্ত হতে চলেছে । আপনি এটি করতে সক্ষম হবেন:

name = 'Spongebob Squarepants'
print(f'Who lives in a Pineapple under the sea? \n{name}')

নোট করুন যে আমি স্পঞ্জববকে ঘৃণা করি তাই এটি লেখা কিছুটা বেদনাদায়ক ছিল। :)


সেই স্পঞ্জবব রেফারেন্সের জন্য থেক্স (/ ডিস্ট্রেস্ট): এখনই এটি উঁচুতে হবে।
জাভাদবা

4

আপনি এই পেতে পারেন

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n{name}.".format(name=name)

http://docs.python.org/2/library/string.html#formatstrings


আমি বিশ্বাস করি না যে ওপি #মুদ্রিত হবে intended তারা কেবল রুবি সিনট্যাক্স ব্যবহার করছে।
jaynp

তুমি ঠিক বলছো. আমি উত্তর সম্পাদনা করেছি। আমি রুবির সাথে পরিচিত নই, তাই ভেবেছিলাম #চরিত্রটি মুদ্রিত হবে।
কোয়ান থেকে

3
import inspect
def s(template, **kwargs):
    "Usage: s(string, **locals())"
    if not kwargs:
        frame = inspect.currentframe()
        try:
            kwargs = frame.f_back.f_locals
        finally:
            del frame
        if not kwargs:
            kwargs = globals()
    return template.format(**kwargs)

ব্যবহার:

a = 123
s('{a}', locals()) # print '123'
s('{a}') # it is equal to the above statement: print '123'
s('{b}') # raise an KeyError: b variable not found

PS: কর্মক্ষমতা একটি সমস্যা হতে পারে। এটি স্থানীয় স্ক্রিপ্টগুলির জন্য দরকারী, উত্পাদন লগগুলির জন্য নয়।

অনুরূপ করা:


2

পুরানো পাইথনের জন্য (২.৪-তে পরীক্ষিত) শীর্ষ সমাধানটি নির্দেশ করে। তুমি এটি করতে পারো:

import string

def try_interp():
    d = 1
    f = 1.1
    s = "s"
    print string.Template("d: $d f: $f s: $s").substitute(**locals())

try_interp()

এবং আপনি পেতে

d: 1 f: 1.1 s: s

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