-র-ব্লকের বাইরে উপলব্ধ স্টেটমেন্ট সহ চলক সংজ্ঞায়িত?


90

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

with open('a.txt') as f:
    pass
# Is f supposed to be defined here?

আমি বিবৃতি সহ পিইপি -৪৪৩ এর জন্য ভাষা ডকস (২.7) পড়েছি, তবে যতদূর আমি বলতে পারি তারা এ বিষয়ে কিছু বলেন না।

সিপিথন ২.6.৫ f-এ ব্লক-এর বাইরে সংজ্ঞায়িত বলে মনে হয়, তবে পরিবর্তিত হতে পারে এমন কোনও বাস্তবায়নের বিশদটির উপর নির্ভর করতে চাই না।


8
ঘেরের স্কোপ এফ উপলব্ধ হবে কিনা তা ইতিমধ্যে উত্তর দেওয়া হয়েছে। আমার জন্য প্রসঙ্গ পরিচালকদের পুরো ধারণাটি ক্লিক হয়েছিল যখন আমি বুঝতে পারলাম যে একটি প্রসঙ্গে ধারণার ধারণাটি স্কোপের চেয়ে আলাদা । এখানে আমার ওয়েবসাইটের একটি লিঙ্ক রয়েছে যা আশা করি কিছুটা সহায়তা করবে: মার্কাস- গ্যাটল.নাম
টম

4
হুবহু - একটি প্রসঙ্গ বর্তমান অবস্থা পরিবর্তন করার বিষয় - ফাইল খোলা, ফাইল বন্ধ বা থ্রেড লক / আনলক করা। ডিভাইস বরাদ্দ / নির্বিঘ্ন। স্কোপটিতে নামযুক্ত সমস্ত ভেরিয়েবলগুলি এখনও রয়েছে - তবে তারা এখন অবনমিত / বন্ধ / আনলক করা হ্যান্ডলগুলি নির্দেশ করবে।
ড্যানি স্ট্যাপল

উত্তর:


159

হ্যাঁ, প্রসঙ্গ পরিচালকটি স্টেটমেন্ট সহ বাইরের জন্য উপলব্ধ হবে এবং এটি বাস্তবায়ন বা সংস্করণ নির্ভর নয়। বিবৃতি সহ একটি নতুন এক্সিকিউশন সুযোগ তৈরি করে না


4
এটি আমার মতে স্পষ্ট ব্যাখ্যা তাই গ্রহণযোগ্য উত্তর পুরষ্কার; অতিরিক্ত সহায়ক তথ্যের জন্য অ্যালেক্স এবং টোকেনম্যাকগুয়েকে পয়েন্ট দেবে।
হাইক্কি তোভোনেন

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

28

withশব্দবিন্যাস:

with foo as bar:
    baz()

এর জন্য প্রায় চিনির পরিমাণ:

try:
    bar = foo.__enter__()
    baz()
finally:
    if foo.__exit__(*sys.exc_info()) and sys.exc_info():
        raise

এটি প্রায়শই দরকারী। উদাহরণ স্বরূপ

import threading
with threading.Lock() as myLock:
    frob()

with myLock:
    frob_some_more()

কনটেক্সট ম্যানেজার একাধিকবার ব্যবহার হতে পারে।


ঠিক আছে, লক পুনঃব্যবহার করতে পারে বা নাও পারে (কোনও ধারণা নেই, তবে এটি পৃথক হলে এটি একটি ত্রুটি হবে) - তবে পাইথন স্কোপিংয়ের নিয়মগুলি এখানে বাস্তবায়নগুলি জুড়ে অবশ্যই একই হবে।
ফিজিম্যান

4
এটি আবার কোনও স্কোপিংয়ের সমস্যা নয়। স্কোপিং একই হবে। যাইহোক, যদি foo .__ প্রস্থানকরণের প্রয়োগটি থ্রেডটিকে একটি থামানো অবস্থায় ফেলে দেয়, তবে লকটি যদি এন্টার না করে যা এটি রিল্যাক্স করে, দ্বিতীয় বিবৃতিটি থ্রেড লকগুলির জন্য কার্যকর কিছু করবে না বলে মনে হচ্ছে না।
ড্যানি স্ট্যাপল

16

যদি fকোনও ফাইল হয় তবে এটি withবিবৃতিটির বাইরেই প্রদর্শিত হবে ।

উদাহরণস্বরূপ, এটি

f = 42
print f
with open('6432134.py') as f:
    print f
print f

মুদ্রণ করবে:

42
<open file '6432134.py', mode 'r' at 0x10050fb70>
<closed file '6432134.py', mode 'r' at 0x10050fb70>

আপনি PEP-0343 বিভাগে সুনির্দিষ্টতা: 'উইথ' স্টেটমেন্টের অধীনে বিশদটি সন্ধান করতে পারেন । পাইথন স্কোপ বিধিগুলি (যা বিরক্তিকর হতে পারে ) fপাশাপাশি প্রয়োগ হয় ।


আমি এটি জানি, আমি প্রশ্নে এটি উল্লেখ করেছি। সিপিথনের জন্য কমপক্ষে 2.6.5। তবে আপনি কি গ্যারান্টি দিতে পারেন যে এটি জাইথন, আয়রন পাইথন এবং পাইপাইয়ের জন্য?
হাইক্কি টোভোনেন

পাইথনের স্কোপ বিধি সবসময় এতটা পরিষ্কার হয় না। CPython 2.6.5 এই বিবেচনা করুন: [x for x in [1]]xএর বাইরে পাওয়া যায়। এটি একটি জেনারেটর মধ্যে তৈরি করুন: (x for x in [1])। এখন xপাওয়া যায় না। আমি পাইথন 3 এ এটির পরিবর্তিত হয়ে গেছে বলে মনে হচ্ছে যাতে তালিকান বোধগম্যতার সাথেও xফাঁস না হয় তবে এখনই উল্লেখটি খুঁজে পাচ্ছি না can't
হেইকি তোইভোনেন

আমি অনুসন্ধান করেছি, কিন্তু আপাতত উল্লেখযোগ্য কিছু পাইনি। আকর্ষণীয় প্রশ্ন, যদিও।
মিকু

আসলে এটি কোনও সুযোগের বিষয় নয় - ভেরিয়েবল এফটি এখনও পাওয়া যায় তবে এটি এখন বন্ধ অবস্থায় অবস্থায় ফাইল করার জন্য একটি হ্যান্ডেল is একই ফাইলটি যা আগে আগে খোলা ছিল। প্রসঙ্গ ছেড়ে গেলে প্রস্থান করার সময় এই অবস্থার পরিবর্তন হবে।
ড্যানি স্ট্যাপল

11

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

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