কীভাবে এফ-স্ট্রিংয়ের মূল্যায়ন স্থগিত / স্থগিত করবেন?


102

আমি কিছু ফাইল উত্পন্ন করতে টেম্পলেট স্ট্রিংগুলি ব্যবহার করছি এবং আমার আগের টেম্পলেট কোডটি এর থেকে কিছুটা হ্রাস করার জন্য আমি এই উদ্দেশ্যে নতুন এফ-স্ট্রিংয়ের সংক্ষিপ্ততা পছন্দ করি:

template_a = "The current name is {name}"
names = ["foo", "bar"]
for name in names:
    print (template_a.format(**locals()))

এখন আমি এটি করতে পারি, সরাসরি ভেরিয়েবলগুলি প্রতিস্থাপন:

names = ["foo", "bar"]
for name in names:
    print (f"The current name is {name}")

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

কোনও স্ট্রিং আনার কোনও উপায় আছে এবং .format(**locals())কলটি এড়ানোর জন্য এফ-স্ট্রিং হিসাবে ব্যাখ্যা করা হয়েছে ?

আদর্শভাবে আমি এই জাতীয় কোড করতে সক্ষম হতে চাই ... (যেখানে magic_fstring_functionআমি বুঝতে পারি না এমন অংশটি কোথায় আসে):

template_a = f"The current name is {name}"
# OR [Ideal2] template_a = magic_fstring_function(open('template.txt').read())
names = ["foo", "bar"]
for name in names:
    print (template_a)

... এই কাঙ্ক্ষিত আউটপুট সহ (ফাইলটি দুটিবার না পড়ে):

The current name is foo
The current name is bar

... তবে আসল আউটপুটটি আমি পাই:

The current name is {name}
The current name is {name}

4
আপনি fস্ট্রিং দিয়ে এটি করতে পারবেন না । একটি fস্ট্রিং ডেটা নয় এবং এটি অবশ্যই স্ট্রিং নয়; এটি কোড ( disমডিউলটি দিয়ে এটি পরীক্ষা করুন )) আপনি যদি পরবর্তী সময়ে কোডটি মূল্যায়ন করতে চান তবে আপনি একটি ফাংশন ব্যবহার করেন।
kindall

12
এফওয়াইআই, পিইপি 501 আপনার প্রথম আদর্শের কাছাকাছি একটি বৈশিষ্ট্য প্রস্তাব করেছে, তবে এটি বর্তমানে "[এফ-স্ট্রিং] সহ আরও অভিজ্ঞতার জন্য মুলতুবি রয়েছে"।
jwodder

একটি টেমপ্লেট একটি স্ট্যাটিক স্ট্রিং, তবে একটি এফ-স্ট্রিং একটি স্ট্রিং নয়, এটি একটি কোড অবজেক্ট, যেমন @ জেন্ডাল বলেছেন। আমি মনে করি একটি এফ-স্ট্রিংটি তাত্ক্ষণিকভাবে তাত্ক্ষণিকভাবে আবশ্যক যখন তা ইনস্ট্যান্ট করা হবে (পাইথন ৩.6,7-এ), অবশেষে এটি ব্যবহার করার পরে নয়। সুতরাং আপনার কুরুচিপূর্ণ পুরানো তুলনায় এফ-স্ট্রিং কম কার্যকর হতে পারে .format(**locals()), যদিও প্রসাধনীভাবে সুন্দর। পিইপি -501 প্রয়োগ না করা পর্যন্ত।
smci

গাইড আমাদের বাঁচান, কিন্তু পিইপি 498 সত্যিই এটি পেয়েছেপিইপি 501 দ্বারা বর্ণিত মুলতুবি মূল্যায়ন একেবারে মূল এফ স্ট্রিং বাস্তবায়নে বেক করা উচিত ছিল। এখন আমরা একদিকে যেমন str.format()স্থগিত মূল্যায়নকে সমর্থন করে একটি কম বৈশিষ্ট্যযুক্ত, অত্যন্ত ধীর পদ্ধতি এবং অন্যদিকে স্থগিত মূল্যায়ন সমর্থন না করা আরও বৈশিষ্ট্যযুক্ত, অত্যন্ত দ্রুত এফ-স্ট্রিং সিনট্যাক্সের মধ্যে ফেলে রেখেছি । সুতরাং আমাদের এখনও উভয় প্রয়োজন এবং পাইথনের এখনও কোনও স্ট্যান্ডার্ড স্ট্রিং বিন্যাস নেই। এক্সকেসিডি স্ট্যান্ডার্ড মেম .োকান।
সিসিল কারি

উত্তর:


26

এখানে একটি সম্পূর্ণ "আদর্শ 2"।

এটি কোনও এফ-স্ট্রিং নয় — এটি এফ-স্ট্রিংগুলি ব্যবহার করে না — তবে এটি অনুরোধ অনুযায়ী করে। নির্দিষ্ট হিসাবে সিনট্যাক্স। যেহেতু আমরা ব্যবহার করছি না কোনও সুরক্ষার মাথাব্যথা নেই eval()

এটি একটি সামান্য ক্লাস এবং প্রয়োগগুলি ব্যবহার করে __str__যা স্বয়ংক্রিয়ভাবে মুদ্রণ দ্বারা ডাকা হয়। শ্রেণীর সীমিত সুযোগ থেকে বাঁচতে আমরা inspectমডিউলটি একটি ফ্রেম হ্যাপ করতে ব্যবহার করি এবং কলারটির যে ভেরিয়েবলের অ্যাক্সেস রয়েছে তা দেখতে।

import inspect

class magic_fstring_function:
    def __init__(self, payload):
        self.payload = payload
    def __str__(self):
        vars = inspect.currentframe().f_back.f_globals.copy()
        vars.update(inspect.currentframe().f_back.f_locals)
        return self.payload.format(**vars)

template = "The current name is {name}"

template_a = magic_fstring_function(template)

# use it inside a function to demonstrate it gets the scoping right
def new_scope():
    names = ["foo", "bar"]
    for name in names:
        print(template_a)

new_scope()
# The current name is foo
# The current name is bar

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

6
যখন টেমপ্লেটে সাধারণ ভেরিয়েবলের নামের চেয়ে আরও জটিল কিছু অন্তর্ভুক্ত থাকে তখন এটি কাজ করে না। উদাহরণস্বরূপ: template = "The beginning of the name is {name[:4]}"(-> TypeError: string indices must be integers)
বিলি

6
@ বিলি আকর্ষণীয়, এটি একটি সীমাবদ্ধ বলে মনে হচ্ছে str.format। আমি ভাবতাম যে এফ-স্ট্রিংগুলি কেবল এমন কিছুর জন্য সিনট্যাকটিক চিনি str.format(**locals(), **globals())তবে স্পষ্টতই আমি ভুল ছিল।
পল প্যানজার

4
উত্পাদনে দয়া করে এটি ব্যবহার করবেন না। inspectএকটি লাল পতাকা।
আলেকজান্ডার্নস্ট

4
আমার 2 টি প্রশ্ন রয়েছে, কেন উত্পাদনের জন্য একটি "লাল পতাকা" পরিদর্শন করা হচ্ছে এরকম একটি ব্যতিক্রম হতে পারে বা আরও কার্যকরী কাজের সুযোগ থাকবে? এবং __slots__হ্রাস মেমরি ব্যবহারের জন্য এখানে ব্যবহার বিরুদ্ধে কিছু আছে ?
জাব

21

এর অর্থ টেমপ্লেট এটির মধ্যে ফর্ম্যাটিং ট্যাগ সহ একটি স্ট্যাটিক স্ট্রিং

হ্যাঁ, ঠিক এই কারণেই আমাদের প্রতিস্থাপন ক্ষেত্রগুলি সহ আক্ষরিক রয়েছে এবং .formatতাই আমরা যখনই ফোনগুলি কল formatকরে ক্ষেত্রগুলি প্রতিস্থাপন করতে পারি।

দোভাষীকে স্ট্রিংটিকে একটি নতুন এফ-স্ট্রিং হিসাবে ব্যাখ্যা করতে বলার জন্য স্ট্রিংয়ের কিছু একটা ঘটতে হবে

এটা উপসর্গ f/F। আপনি এটিকে কোনও ফাংশনে মুড়িয়ে রাখতে পারেন এবং কল সময় মূল্যায়ন স্থগিত করতে পারেন তবে অবশ্যই অতিরিক্ত ওভারহেড লাগবে:

template_a = lambda: f"The current name is {name}"
names = ["foo", "bar"]
for name in names:
    print (template_a())

যা মুদ্রণ করে:

The current name is foo
The current name is bar

তবে ভুল অনুভব করে এবং এটি কেবলমাত্র আপনার প্রতিস্থাপনে বিশ্বব্যাপী নেমস্পেসে উঁকি দিতে পারেন এই বিষয়টি দ্বারা সীমাবদ্ধ। স্থানীয় নামগুলির প্রয়োজন এমন পরিস্থিতিতে এটি ব্যবহার করার চেষ্টা মারাত্মকভাবে ব্যর্থ হবে যদি না আর্গুমেন্ট হিসাবে স্ট্রিংয়ে না যায় (যা পুরোপুরি বিন্দুটিকে পরাজিত করে)।

কোনও স্ট্রিং আনার কোনও উপায় আছে এবং .format(**locals())কলটি এড়ানোর জন্য এফ-স্ট্রিং হিসাবে ব্যাখ্যা করা হয়েছে ?

কোনও ফাংশন (সীমাবদ্ধতা অন্তর্ভুক্ত) ব্যতীত, না, তাই পাশাপাশি থাকতে পারে .format


মজার, আমি ঠিক একই স্নিপেট পোস্ট ছিল। তবে স্কোপিং সীমাবদ্ধতার কারণে আমি এটি প্রত্যাহার করেছি। (কোনও ফাংশনে লুপটি মোড়ানোর চেষ্টা করুন))
পল

@ পলপাঞ্জার আপনি কি প্রশ্নটি সম্পাদনা করে আবার যুক্ত করতে চান? উত্তর মুছে ফেলতে আমার আপত্তি নেই। এটি ওপি-র ক্ষেত্রে কার্যকর একটি বিকল্প , এটি সব ক্ষেত্রেই একটি কার্যকর বিকল্প নয় , এটি লুক্কায়িত হচ্ছে।
দিমিত্রিস ফাসারাকিস হিলিয়ার্ড

4
না, এটা ঠিক আছে, রাখুন। আমি আমার নতুন সমাধানটি নিয়ে অনেক বেশি খুশি। তবে আমি আপনার বক্তব্যটি দেখতে পাচ্ছি যে আপনি যদি এর সীমাবদ্ধতা সম্পর্কে সচেতন হন তবে এটি একটি কার্যকর। হতে পারে আপনি আপনার পোস্টে কিছুটা সতর্কতা যুক্ত করতে পারেন যাতে এটিকে ভুল করে কেউ তাদের পা গুলি করতে না পারে?
পল পান্জার

17

স্ট্রিংকে এফ-স্ট্রিং হিসাবে মূল্যায়ন করার একটি সংক্ষিপ্ত উপায় (এর সম্পূর্ণ ক্ষমতা সহ) নিম্নলিখিত ফাংশনটি ব্যবহার করছে:

def fstr(template):
    return eval(f"f'{template}'")

তারপরে আপনি এটি করতে পারেন:

template_a = "The current name is {name}"
names = ["foo", "bar"]
for name in names:
    print(fstr(template_a))
# The current name is foo
# The current name is bar

এবং অন্যান্য প্রস্তাবিত অনেকগুলি সমাধানের বিপরীতে, আপনি এটিও করতে পারেন:

template_b = "The current name is {name.upper() * 2}"
for name in names:
    print(fstr(template_b))
# The current name is FOOFOO
# The current name is BARBAR

4
এখন পর্যন্ত সেরা উত্তর! এফ-স্ট্রিংগুলি প্রবর্তন করার সময় তারা কীভাবে এই সাধারণ বাস্তবায়নটি অন্তর্নির্মিত বৈশিষ্ট্য হিসাবে অন্তর্ভুক্ত করেনি?
ব্যবহারকারী3204459

4
নাহ, যে সুযোগ হারায়। একমাত্র কারণ যে কাজ করে তা nameহল বিশ্বব্যাপী। মূল্যায়নের ক্ষেত্রে এফ-স্ট্রিংগুলি স্থগিত করা উচিত , তবে ক্লাস এফ স্ট্রিংয়ের কলার স্থানীয় এবং গ্লোবালগুলি দেখে স্কোপযুক্ত যুক্তিগুলির রেফারেন্সের একটি তালিকা তৈরি করা প্রয়োজন ... এবং তারপরে স্ট্রিংটি যখন মূল্যায়ন করা হবে তখন তা মূল্যায়ন করুন।
এরিক অ্যারোনস্টি

4
@ ব্যবহারকারী3204459: যেহেতু নির্বিচারে স্ট্রিংগুলি কার্যকর করতে সক্ষম হওয়া অন্তর্নিহিত একটি সুরক্ষা বিপত্তি - যার কারণে eval()সাধারণত ব্যবহারটি নিরুৎসাহিত করা হয়।
মার্টিনিউ

4
@ মার্টিনো এটি অজগরটির বৈশিষ্ট্য হওয়া উচিত ছিল যাতে আপনার ইওল ব্যবহার করার প্রয়োজন হয় না ... প্লাস, এফ-স্ট্রিংয়ের ক্ষেত্রে ইওল () এর মতো ঝুঁকি থাকে কারণ আপনি দূষিত কোড সহ কোঁকড়ানো বন্ধনীতে কিছু রাখতে পারেন তাই যদি এটি হয় একটি উদ্বেগ তারপর এফ-স্ট্রিং ব্যবহার করবেন না
user3204459

4
আমি ঠিক এটাই খুঁজছিলাম, 'ফ্রিস্টো পোস্টপেন'-এর জন্য ডাক করছিলাম val ইভাল সাধারণভাবে ফ্রাস্ট্রিংয়ের ব্যবহারের চেয়ে খারাপ বলে মনে হয় না, কারণ তারা, আমার ধারণা, উভয়ই একই ক্ষমতা অর্জন করেছে: f "{eval (' মুদ্রণ (42) ')} "
user2692263

12

F-স্ট্রিং কেবল একটি বিন্যস্ত স্ট্রিং তৈরি করার সময়, প্রতিস্থাপন একটি সংক্ষিপ্ত পথ .format(**names)সঙ্গে f। আপনি যদি চান না যে কোনও স্ট্রিংটি অবিলম্বে এমনভাবে মূল্যায়ন করা হয় তবে এটিকে এফ স্ট্রিং তৈরি করবেন না। এটিকে একটি সাধারণ স্ট্রিং আক্ষরিক হিসাবে সংরক্ষণ করুন এবং formatআপনি যখন করছেন তখন যেমন আপনি ইন্টারপোলেশনটি সম্পাদন করতে চান তখন এটিকে কল করুন।

অবশ্যই, সঙ্গে একটি বিকল্প আছে eval

template.txt:

f'বর্তমান নাম {নাম} '

কোড:

>>> template_a = open('template.txt').read()
>>> names = 'foo', 'bar'
>>> for name in names:
...     print(eval(template_a))
...
The current name is foo
The current name is bar

কিন্তু তারপর আপনি সব করতে প্রতিস্থাপন করা হয় পরিচালিত থাকেন str.formatসঙ্গে eval, যা নিশ্চয় এটি অধিকারী না হয়। একটি formatকল দিয়ে কেবল নিয়মিত স্ট্রিং ব্যবহার করা চালিয়ে যান ।


4
আপনার কোডের স্নিপেটে আমি সত্যিই কোনও সুবিধা দেখছি না। মানে, আপনি সর্বদা ফাইলের The current name is {name}অভ্যন্তরে লিখতে পারেন template.txtএবং তারপরে print(template_a.format(name=name))(বা .format(**locals())) ব্যবহার করতে পারেন । কোডটি প্রায় 10 টি অক্ষর লম্বা, তবে এটি কোনও সম্ভাব্য সুরক্ষা সমস্যার কারণে প্রবর্তন করে না eval
বাকুরিউ

@ বাকুরিউ - হ্যাঁ; যেমন আমি বলেছিলাম, যদিও evalআমাদের পছন্দসই অবধি f'{name}'মূল্যায়ন লিখতে এবং বিলম্ব করার অনুমতি দেয় তবে ওপি ইতিমধ্যে যা করছিল তা nameকেবল নিয়মিত টেম্পলেট স্ট্রিং তৈরি করা এবং তারপরে formatএটি আহ্বান করা নিকৃষ্টতর ।
টাইগারহকটি 3

4
"একটি এফ-স্ট্রিং কেবলমাত্র ফর্ম্যাট স্ট্রিং তৈরির আরও সংক্ষিপ্ত উপায়,। ফর্ম্যাট (** নাম) এর সাথে চ এর পরিবর্তে" " বেশ নয় - তারা বিভিন্ন বাক্য গঠন ব্যবহার করে। আমার কাছে চেক করার জন্য সাম্প্রতিক পর্যায়ে অজগর 3 নেই, তবে উদাহরণস্বরূপ আমি বিশ্বাস করি f '{a + b}' কাজ করে, যখন '{a + b}' ফর্ম্যাট (a = a, b = b) কীআরআর উত্থাপন করে । .format () সম্ভবত অনেক প্রসঙ্গে ভাল, তবে এটি কোনও ড্রপ-ইন প্রতিস্থাপন নয়।
ফিলাহ

4
@philh আমি শুধু একটি উদাহরণ যেখানে সম্মুখীন .formatকরা হয় f- স্ট্রিং, যাতে আপনি মন্তব্য সমর্থন করতে পারে না সমতূল্য নয়: DNA = "TATTCGCGGAAAATATTTTGA"; fragment = f"{DNA[2:8]}"; failed_fragment = "{DNA[2:8]}".format(**locals())failed_fragmentফলাফল তৈরি করার চেষ্টা TypeError: string indices must be integers
বিলি

12

। ফরম্যাট ব্যবহার করা এই প্রশ্নের সঠিক উত্তর নয়। পাইথন এফ-স্ট্রিংগুলি স্ট্রিম্পরম্যাট () টেম্পলেটগুলির থেকে খুব আলাদা ... এগুলিতে কোড বা অন্যান্য ব্যয়বহুল ক্রিয়াকলাপ থাকতে পারে - সুতরাং ডিফারাল প্রয়োজন।

মুলতুবি লগারের উদাহরণ এখানে। এটি লগিং.গেটলগারের সাধারণ উপস্থাপক ব্যবহার করে, তবে তারপরে নতুন ফাংশন যুক্ত করে যা লগ স্তরটি সঠিক হলে কেবল এফ-স্ট্রিংকে ব্যাখ্যা করে।

log = logging.getLogger(__name__)

def __deferred_flog(log, fstr, level, *args):
    if log.isEnabledFor(level):
        import inspect
        frame = inspect.currentframe().f_back.f_back
        try:
            fstr = 'f"' + fstr + '"'
            log.log(level, eval(fstr, frame.f_globals, frame.f_locals))
        finally:
            del frame
log.fdebug = lambda fstr, *args: __deferred_flog(log, fstr, logging.DEBUG, *args)
log.finfo = lambda fstr, *args: __deferred_flog(log, fstr, logging.INFO, *args)

এর মতো log.fdebug("{obj.dump()}")কাজগুলিতে সক্ষম হওয়ার সুবিধা রয়েছে: .... ডিবাগিং সক্ষম না করা হলে অবজেক্টটি ডাম্প না করে।

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

এফ-স্ট্রিংগুলি যথাযথভাবে পিছিয়ে দেওয়ার জন্য, অজগরটির স্পষ্টভাবে পরিবর্তনের আচরণের কিছু উপায় প্রয়োজন। 'জি' অক্ষরটি ব্যবহার করতে পারেন? ;)

এটি চিহ্নিত করা হয়েছে যে স্ট্রিং কনভার্টারে কোনও বাগ থাকলে স্থগিত লগিং ক্রাশ হওয়া উচিত নয়। উপরে সমাধান এই হিসাবে ভাল করতে পারেন, পরিবর্তন finally:করার জন্য except:, এবং একটি বিদ্ধ log.exceptionসেখানে।


4
এই উত্তরটির সাথে একাগ্রভাবে সম্মত হন। এই ব্যবহারের কেসটি হ'ল এই প্রশ্নটি অনুসন্ধান করার সময় আমি যা ভাবছিলাম।
জাস্টহেল্ফ

4
এটা সঠিক উত্তর. কিছু সময়: %timeit log.finfo(f"{bar=}") 91.9 µs ± 7.45 µs per loop %timeit log.info(f"{bar=}") 56.2 µs ± 630 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) log.setLevel(logging.CRITICAL) %timeit log.finfo("{bar=}") 575 ns ± 2.9 ns per loop %timeit log.info(f"{bar=}") 480 ns ± 9.37 ns per loop %timeit log.finfo("") 571 ns ± 2.66 ns per loop %timeit log.info(f"") 380 ns ± 0.92 ns per loop %timeit log.info("") 367 ns ± 1.65 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
জালিক্স

8

আপনি যা চান তা পাইথন বর্ধন হিসাবে বিবেচিত বলে মনে হচ্ছে ।

এদিকে - সংযুক্ত আলোচনা থেকে - নীচেরগুলি মনে হচ্ছে এটি একটি যুক্তিসঙ্গত কাজ হবে যা ব্যবহারের প্রয়োজন হবে না eval():

class FL:
    def __init__(self, func):
        self.func = func
    def __str__(self):
        return self.func()


template_a = FL(lambda: f"The current name, number is {name!r}, {number+1}")
names = "foo", "bar"
numbers = 40, 41
for name, number in zip(names, numbers):
    print(template_a)

আউটপুট:

The current name, number is 'foo', 41
The current name, number is 'bar', 42

7

উত্তর দ্বারা অনুপ্রেরণা দ্বারা অনুপ্রাণিত , নিম্নলিখিত একটি মুলতুবি- f- স্ট্রিং ক্লাস সংজ্ঞায়িত করতে ব্যবহার করা যেতে পারে।

class FStr:
    def __init__(self, s):
        self._s = s
    def __repr__(self):
        return eval(f"f'{self._s}'")

...

template_a = FStr('The current name is {name}')

names = ["foo", "bar"]
for name in names:
    print (template_a)

প্রশ্নটি যা ঠিক তাই চেয়েছিল


4

অথবা এফ স্ট্রিং ব্যবহার করবেন না, কেবল বিন্যাস করুন:

fun = "The curent name is {name}".format
names = ["foo", "bar"]
for name in names:
    print(fun(name=name))

নাম ছাড়া সংস্করণে:

fun = "The curent name is {}".format
names = ["foo", "bar"]
for name in names:
    print(fun(name))

এটি সব ক্ষেত্রে কার্যকর হয় না। উদাহরণ: fun = "{DNA[2:8]}".format; DNA = "TATTCGCGGAAAATATTTTGA"; fun(DNA=DNA)। ->TypeError: string indices must be integers
বিলি

কিন্তু এটা স্বাভাবিক ব্যবহার এছাড়াও কাজ না করে, দয়া করে উত্তর দিন তাকান stackoverflow.com/questions/14072810/...
msztolcman


0

একটি পরামর্শ যা এফ-স্ট্রিংগুলি ব্যবহার করে। আপনার মূল্যায়নটি লজিক্যাল স্তরে করুন যেখানে টেম্প্লেটিং হচ্ছে and এবং জেনারেটর হিসাবে এটি পাস করুন। আপনি এফ-স্ট্রিংস ব্যবহার করে আপনি যে পয়েন্টটি বেছে নিন তা আনইন্ডাইন্ড করতে পারেন

In [46]: names = (i for i in ('The CIO, Reed', 'The homeless guy, Arnot', 'The security guard Spencer'))

In [47]: po = (f'Strangely, {next(names)} has a nice {i}' for i in (" nice house", " fast car", " big boat"))

In [48]: while True:  
...:     try:  
...:         print(next(po))  
...:     except StopIteration:  
...:         break  
...:       
Strangely, The CIO, Reed has a nice  nice house  
Strangely, The homeless guy, Arnot has a nice  fast car  
Strangely, The security guard Spencer has a nice  big boat  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.