क्या रूबी के स्ट्रिंग प्रक्षेप के बराबर एक पायथन है?


343

रूबी उदाहरण:

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

सफल पायथन स्ट्रिंग संघनन मेरे लिए शब्दशः प्रतीत होता है।


2
यहाँ मुद्दा यह है कि nameस्ट्रिंग में एक स्थानीय वैरिएबल है, और पाइथन में आपको स्पष्ट रूप से स्थानीय वेरिएबल्स के शब्दकोश को स्ट्रिंग फॉर्मैटर में पास करना होगा यदि आप चाहते हैं कि यह उनका उपयोग करें।
कैटरील

यह मूल मुद्दा नहीं था, लेकिन धन्यवाद। आपकी टिप्पणी ने मुझे चर क्षेत्र की थोड़ी बेहतर समझ दी (कुछ मैं अभी भी साथ पा रहा हूं)। :)
जाति

1
आप इस बारे में क्या सोचते हैं, फिर? stackoverflow.com/questions/16504732/…
साल्चीपापा


2
3.6 में इस सटीक सुविधा के लिए stackoverflow.com/a/33264516/55721 देखें
dss539

जवाबों:


413

पाइथन 3.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"))

@Caste यहां देखें: docs.python.org/library/stdtypes.html#string-formatting और अगर आपको किसी और विवरण की जरूरत है तो एक फॉलो अप कमेंट पोस्ट करें
mikej

मैं इसके मूल सिद्धांत को समझता हूं, लेकिन मैं प्रलेखन में उदाहरण में पाए गए सभी अतिरिक्त प्रतीकों और पाठ को पूरी तरह से नहीं समझता हूं। यहाँ स्ट्रिंग में कनवर्ट करने का उपयोग क्यों:% (भाषा) का '03d ’में 3 क्या दर्शाता है? स्ट्रिंग के बाद%% क्यों है? प्रिंट अभिव्यक्ति के बाद वेरिएबल्स का असाइनमेंट (यदि वे वास्तव में वैरिएबल हैं) मुझे भी भ्रमित करते हैं। क्षमा करें यदि यह एक दर्द है!
जाति

1
उदाहरण में उपयोग किए जाने वाले दो मूल प्रारूप %sएक स्ट्रिंग के लिए हैं और %03dअग्रणी शून्य के साथ 3 अंकों के लिए एक संख्या है। यह सिर्फ लिखा जा सकता है print "%s has %03d" % ("Python", 2)। इसके बाद उदाहरण ब्रैकेट में एक मैपिंग कुंजी लगाने का उपयोग करता है, %जिसके बाद स्ट्रिंग में अपने आदेश पर भरोसा करने के बजाय प्लेसहोल्डर्स को सार्थक नाम देने का एक तरीका है। फिर आप एक शब्दकोश पारित करते हैं जो उनके मूल्यों के प्रमुख नामों को मैप करता है। यही कारण है कि स्वेन locals()फ़ंक्शन का उपयोग कर रहा है, जो आपके सभी स्थानीय चर वाले एक तानाशाह को लौटाता है, इसलिए यह nameनाम के मूल्य के लिए मैप करेगा
mikej

रूपांतरण प्रकार के आवश्यक उपयोग ने मुझे पहले भ्रमित किया। इसलिए, प्रलेखन शब्दावली का उपयोग करना। % विनिर्देशन शुरू करता है। (भाषा) के लिए कोई रूपांतरण ध्वज नहीं है, बस एक रूपांतरण प्रकार (अनुगामी 's') है; (संख्या) में हालांकि एक (या दो) रूपांतरण झंडे हैं जो क्रमशः '0' (और '3') हैं। 'D' रूपांतरण प्रकार है और यह दर्शाता है कि यह एक पूर्णांक है। क्या मैं सही से समझ पाया?
जाति

@ स्वाद: हाँ, यह मूल रूप से सही है। ध्यान दें कि आप हमेशा sरूपांतरण प्रकार के रूप में उपयोग कर सकते हैं - पायथन किसी भी चीज को स्ट्रिंग में बदल सकता है। लेकिन निश्चित रूप से आप अन्य रूपांतरण प्रकारों की विशेष स्वरूपण क्षमताओं को खो देंगे।
स्वेन मार्नाच

143

पाइथन 2.6.X के बाद से आप उपयोग करना चाहते हैं:

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

27
ध्यान दें कि %स्ट्रिंग प्रक्षेप के लिए ऑपरेटर 3.ththx में पदावनत नहीं किया गया है। docs.python.org/dev/py3k/whatsnew/…% 3.1 में शुरू करने की योजना की घोषणा करता है , लेकिन ऐसा कभी नहीं हुआ।
स्वेन मार्नाच

8
% -syntax अभी भी पायथन 3 में रहता है (पायथन 3.2 के रूप में पदावनत नहीं)
कोरी गोल्डबर्ग

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/functions.html


1
मैं 2 चर के साथ इस तरह से कैसे कर सकता हूं?
जूलियो मरींस

16
@JulioMarins एक टपल का उपयोग करें print "First is %s, second is %s" % (var1, var2):।
kirbyfan64sos

28

स्ट्रिंग इंटरपोल को PEP 498 में निर्दिष्ट के रूप में पायथन 3.6 के साथ शामिल किया जा रहा है । आप ऐसा करने में सक्षम होंगे:

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

ध्यान दें कि मुझे Spongebob से नफरत है, इसलिए यह लिखना थोड़ा दर्दनाक था। :)


कि Spongebob संदर्भ (/ अरुचि) के लिए Thx: अब यह होगा।
javadba

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


मुझे विश्वास नहीं है कि ओपी #को मुद्रित करने का इरादा है । वे सिर्फ रूबी सिंटैक्स का उपयोग कर रहे हैं।
जयनप

आप सही हे। मैंने उत्तर संपादित किया। मैं रूबी से परिचित नहीं हूं, इसलिए मुझे लगा कि #चरित्र मुद्रित होगा।
क्वान टू

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

पुनश्च: प्रदर्शन एक समस्या हो सकती है। यह स्थानीय स्क्रिप्ट के लिए उपयोगी है, उत्पादन लॉग के लिए नहीं।

दोहराए:


2

पुराने पायथन (2.4 पर परीक्षण) के लिए शीर्ष समाधान रास्ता बताता है। तुम यह केर सकते हो:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.